首先,它与此功能有关:
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/