python中的"全局名称未定义"概念



我正在学习Python,也读过关于这个错误的博客,但我仍然不能清楚地理解这一点。这是我正在写的代码片段:

for i in included:
global signs,accounts, regions
global sign_name, acc_name, rg_name
if type == "regions":
regions = i
rg_name = regions['data']['region']
if type == "accounts":
accounts = i
acc_name = accounts['data']['account']
print("Stopping account " + acc_name + " in region " + rg_name)

NameError:未定义全局名称"acc_name"。

我使用的是Python 2.7如果有人能帮助我理解Python中全局名称和初始化的概念,那就太好了。提前谢谢。

不用担心:)欢迎使用Python!它抛出这个错误是因为它在寻找一个不存在的全局变量——而它不存在的原因是因为你没有达到if type == "accounts"条件!

试试这个:

for i in included:
global signs,accounts, regions
global sign_name, acc_name, rg_name
regions = "no region yet"
acc_name = "no acc_name yet"
if type == "regions"
regions = i
rg_name = regions['data']['region']
if type == "accounts"
accounts = i
acc_name = accounts['data']['account']
print("Stopping account " + acc_name + " in region " + rg_name)

这将清除错误,至少让你看到可能出现的其他错误:)

我还要指出,正如我相信你会从其他人那里听到的那样,你没有理由在这种情况下声明全局变量。它最初说"找不到全局变量",因为在输入global关键字之前,它不会触发if语句,所以它首先检查了locals()变量,但没有找到它,搜索了globals()变量,但找不到它。

你可以删除global变量,它会像这样工作:

for i in included:
regions = "no region yet"
acc_name = "no acc_name yet"
if type == "regions"
regions = i
rg_name = regions['data']['region']
if type == "accounts"
accounts = i
acc_name = accounts['data']['account']
print("Stopping account " + acc_name + " in region " + rg_name)

另一个快速提示,永远不要将type作为变量。。。请改用type_。原因是type是一个builtinPython函数,如果使用type作为变量,则会意外地混淆该内置名称。

最后,只是稍微清理一下脚本:

# only use "i" when you're using numbers, otherwise just call it 
# the name of the data you're using :)
for account_data in included:
regions = "no region yet"
acc_name = "no acc_name yet"
if type_ == "regions"
rg_name = account_data['data']['region']
if type_ == "accounts"
acc_name = account_data['data']['account']
# here's an example of Pythonic string formatting :)
print("Stopping account {} in region {}".format(acc_name, rg_name))

据我所知,您从未在本地和全局范围中预定义acc_name。如果在print("Stopping account " + acc_name + " in region " + rg_name)之前的任何位置添加acc_name = 'something',则该错误将不存在。

代码中的错误是if type == "accounts",但类型不是"accounts",因此acc_name = accounts['data']['account']从未运行过。

试试这个:

for i in included:
global signs,accounts, regions
global sign_name, acc_name, rg_name
if type == "regions":
regions = i
rg_name = regions['data']['region']
else:
rg_name="No regions" #backup str
if type == "accounts":
accounts = i
acc_name = accounts['data']['account']
else:
acc_name="No accounts" #backup str
print("Stopping account " + acc_name + " in region " + rg_name)

这样就不会有错误

我不知道这是否是您的代码,但global命令只需要在函数内部使用,因此不需要在其他地方使用。

顺便说一句,如果再加一点代码就好了,type不是一个好的变量,因为它也是一个内置方法。

您在函数中使用全局变量acc_name进行读取之前,必须首先在某个地方对其进行初始化:在函数外部或内部。如果是type == "accounts",则该变量将被初始化,但如果不是,则不会。

相关内容

  • 没有找到相关文章

最新更新