Python的闭包 - 在赋值之前引用的局部变量

时间:2016-04-27 22:08:09

标签: python

我试图了解如何在Python中使用闭包。

我觉得add1应该在这里工作得很好。我希望在调用x时定义变量helper。但是,它给了我一个Local variable referenced before assignment错误。

add2add1非常相似。它不是用整数赋值x,而是用字典赋值。它的行为也符合我的预期。 x内部helper已定义并可引用。{/ p>

import random

def add1():
    x = 0
    def helper():
        x = x + 1
        return x
    return helper

def add2():
    x = {}
    def helper():
        x[random.randint(1,1000)] = 3
        return x
    return helper

if __name__ == '__main__':
    a1 = add1()
    a2 = add2()

    # print(a1()) #This causes error
    print(a2()) #{650: 3}
    print(a2()) #{650: 3, 333: 3}

这背后的逻辑是什么?除了x的类型不同之外,我在做什么?

1 个答案:

答案 0 :(得分:11)

您期望编译器知道变量已绑定在闭包之外。事实并非如此,因此您需要使用nonlocal来表明这一点。

def add1():
    x = 0
    def helper():
        nonlocal x
        x = x + 1
        return x
    return helper

编辑丹尼斯:

nonlocal中不需要

add2,因为它只是修改x而不是重新绑定它(也就是不重新分配它)。在add1中,x= x+1re-assignment