如果我运行这个脚本:
def main_function():
b = 'b'
def nested_function():
print(b)
#b = 'value change'
nested_function()
main_function()
一切正常。
如果我运行另一个脚本:
def main_function():
b = 'b'
def nested_function():
#print(b)
b = 'value change'
nested_function()
main_function()
一切都很好。正如您所看到的,在这里我更改了nested_function()中的行。
但是如果我用这两条线函数()中的CCD_ 1和CCD_。像这样:
def main_function():
b = 'b'
def nested_function():
print(b)
b = 'value change'
nested_function()
main_function()
然后,出现了一个错误。错误显示:
UnboundLocalError:在分配之前引用了局部变量"b">
我不明白为什么会发生这种情况。
让我们把它们逐一分解。Python的作用域规则有时有点混乱。其基本思想是,如果在给定函数内赋值给一个变量,那么Python会假设该变量是该特定函数的局部变量。
def main_function():
b = 'b'
def nested_function():
print(b)
nested_function()
main_function()
在这里,您从来没有在nested_function
内部分配给b
,所以Python认为没有必要创建新的变量。相反,它从其封闭范围中继承了一个。
def main_function():
b = 'b'
def nested_function():
b = 'value change'
nested_function()
main_function()
在这里,您对其进行赋值,从而获得一个新变量。分配给nested_function
内部的b
与main_function
内部的不相关。他们只是碰巧有一个名字。
def main_function():
b = 'b'
def nested_function():
print(b)
b = 'value change'
nested_function()
main_function()
在这里,执行赋值,因此Python在函数内部生成一个新变量,并且嵌套函数内部对b
的每个引用都指向该新变量,所以就好像您这样做了。
def main_function():
b_0 = 'b'
def nested_function():
print(b_1)
b_1 = 'value change'
nested_function()
main_function()
因此,您试图在分配任何值之前打印出b_1
,因此会出现错误。
如果print(b)
0是一个模块级变量,则可以在函数中使用global
关键字将其标记为模块级变量。在您的情况下,它是一个局部变量;它只是不是立即封闭函数的局部函数。所以我们使用nonlocal
关键字。
def main_function():
b = 'b'
def nested_function():
nonlocal b
print(b)
b = 'value change'
nested_function()
main_function()
CCD_ 13说";我知道我正在分配给b
,但实际上我的意思是使用封闭范围中的那个;。