python中的“Global name not defined”概念

2024-04-16 18:29:18 发布

您现在位置: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)

名称错误:未定义全局名称“acc\u name”。

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


Tags: namein名称dataiftype错误account
3条回答

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

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

代码中的错误是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命令只需要在函数内部使用,因为它不需要在其他地方使用。

另外,需要注意的是,如果代码再多一点,类型就不是一个好的变量,因为它也是一个内置的方法。

不用担心:)欢迎来到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))

相关问题 更多 >