0
def closure():
    a = 2
    def f():
        if a < 5:
            print a
    return f

closure()()

打印 2,这对我来说很有意义,因为您可以读取封闭变量。

def closure():
    a = 2
    def f():
        if a < 5:
            a += 1
            print a
    return f

closure()()

结果File "closure_problems.py", line 4, in f if a < 5: UnboundLocalError: local variable 'a' referenced before assignment

这对我来说也很有意义,因为我知道你不能分配给封闭的变量。但奇怪的是,行号指的是if a < 5而不是看起来应该是实际的违规语句,a += 1.

和这个

def closure():
    a = 2
    def f():
        if a < 5:
            print a
            a += 1
    return f

closure()()

结果File "closure_problems.py", line 4, in f if a < 5: UnboundLocalError: local variable 'a' referenced before assignment. 它甚至不打印2,我根本不明白。

解释器是否试图解析块中的所有内容(不对其进行评估)以找出我是在谈论本地a还是全局?

4

1 回答 1

2

a在函数中赋值会成为函数a的局部变量f()。但是在分配它之前你不能使用它,这就是你在if a < 5语句中得到错误的原因。

解释器是否试图解析块中的所有内容(而不对其进行评估)以找出我是在谈论本地 a 还是全局 a?

是的。

或者好吧,没有尝试,只有做。

于 2013-08-30T02:18:00.650 回答