我正在学习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
是一个builtin
Python函数,如果使用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"
,则该变量将被初始化,但如果不是,则不会。