【问题标题】:'Global name not defined' concept in pythonpython中的“未定义全局名称”概念
【发布时间】:2017-01-29 00:10:55
【问题描述】:

我正在学习 Python,并阅读了有关此错误的博客,但我仍然无法清楚地理解这一点。这是我正在编写的代码的 sn-p:

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 global-variables


【解决方案1】:

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

【讨论】:

  • 非常感谢!这是一个很好的解释,现在它让事情变得清晰了
【解决方案2】:

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

【讨论】:

  • 非常感谢!我在函数之外定义了它们,它可以工作
【解决方案3】:

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

您的代码中的错误是 if type == "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 不是一个好的变量,因为它也是一个内置方法。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2013-08-23
    • 2013-11-12
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2013-07-28
    相关资源
    最近更新 更多