尝试在Python闭包中分配某些东西时先发制人的例外?

时间:2013-08-30 02:12:43

标签: python-2.7 closures

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还是全局?

1 个答案:

答案 0 :(得分:2)

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

  

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

或者,没有尝试,只有这样做。