为什么这个问题会发生在python函数范围内



如果我运行这个脚本:

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内部的bmain_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,但实际上我的意思是使用封闭范围中的那个;。

最新更新