首先,它与此功能有关:

a = 3
def b():
    a = a+1
    return a


返回错误。

是不是当b的本地环境找不到'a'时,然后转到定义了b的父环境,即找到'a'的父环境?

为什么必须使用3引用它才能使它起作用?意思是,仅当直接父环境是全局环境时才需要这样做吗?因为下面的函数似乎能够引用父环境:

def b():
    def c():
        print c
    return c()

最佳答案

这是一个常见的问题,实际上在Python FAQ中:


  [...]当您对范围中的变量进行赋值时,该变量将成为该范围的局部变量,并在外部范围中遮盖任何类似命名的变量。由于foo中的最后一条语句为x分配了一个新值,因此编译器将其识别为局部变量。


因此,Python看到您正在使用a = ..分配给局部变量,并认为,嘿,局部变量,我很好。但是,当它实际上遇到该分配(a + 1)的内容并看到相同的名称a时,它会抱怨,因为您在分配之前试图引用它。

这就是为什么以下内容不会引发错误的原因:

def b():
    a = 20
    a = a + 2
    return a


您首先进行赋值,将a视为函数b的局部变量,并且在遇到a = a + 2时,Python知道a是局部变量,此处没有混淆。



在另一种情况下,您添加了:

def b():
    def c():
        print c
    return c()


您只引用引用在函数b范围内的名称。如果您将其更改为与以前类似的任务,则会得到相同的UnboundLocalError

def b():
    def c():
        c = c + 20
    return c()

关于python - 如果要使用它,是否必须始终在函数中将其引用为全局变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34824453/

10-11 02:57
查看更多