【问题标题】:getting UnboundLocalError: local variable referenced before assignment error获取 UnboundLocalError:在赋值错误之前引用的局部变量
【发布时间】:2015-02-08 08:13:37
【问题描述】:

在尝试运行此代码时,我收到 UnboundLocalError: local variable referenced before assignment 错误。根据 LEGB 规则,这应该可以正常运行。

def xyz():
    count = 1
    def xyz_inner():
        count += 1
        print count
    xyz_inner()
    print count

【问题讨论】:

标签: python scope closures python-2.x


【解决方案1】:

unbound local error

def xyz():
    count = 1
    def xyz_inner():
        count += 1
        print count, locals()
    xyz_inner()
    print count

print hasattr(globals, 'count')
print hasattr(xyz, 'count')

>>> 
False
False

在任何可变对象中定义变量,例如 dictlist(使用相同的引用)并使用扩充赋值对其进行更新。

它有效:-

def xyz():
    count = {'value': 1}
    def xyz_inner():
        count['value'] += 1
        print count['value'],
    xyz_inner()
    print count

xyz()

python closure for nonlocal in python2.7

【讨论】:

  • 请注意,print hasattr(xyz, 'count') 语句告诉您 函数 没有 count 属性。然而,这与包含名称count 的函数调用的本地命名空间不同。函数属性完全独立于调用命名空间。
【解决方案2】:

这里的问题是内部函数中的count 由(增强的)赋值语句绑定,因此被视为xyz_inner() 的本地。因此,代码第一次尝试执行count += 1 时,(本地)变量count 之前没有被赋值,因此它确实是一个未绑定的本地变量。

xyz_inner() 中使用nonlocal count 应该可以通过告诉解释器您要使用xyz()count 而不是创建本地来纠正该问题。

【讨论】:

  • 感谢您的回答现在我将代码修改为 def xyz(): count = 1 def xyz_inner(): global count count += 1 print count xyz_inner() print count 现在给出 NameError: global name 'count' 没有定义,但是根据我的理解,因为 count 已经在封闭函数中定义,所以这个错误不应该出现
  • 可悲的是,global 的意思是“在模块的命名空间中”而不是“在词汇周围函数的命名空间中”,因此我建议使用 nonlocal。不幸的是,我忘记了这是 Python 3 的一个特性。小心使用全局变量进行组件间通信。它真的会破坏软件的凝聚力。
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2013-11-29
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多