获取UnboundLocalError:在赋值错误之前引用的局部变量

时间:2014-12-10 07:55:05

标签: python scope closures python-2.x

在尝试运行此代码时,我在获取UnboundLocalError:引用错误之前引用了局部变量。根据LEGB规则,这应该运行良好。

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

2 个答案:

答案 0 :(得分:1)

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

nonlocal count内使用xyz_inner()可以通过告诉口译员您想要使用xyz()的{​​{1}}而不是创建本地来解决问题。

答案 1 :(得分:0)

请参阅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