這個問題在這里已經有了答案: 首次使用后重新分配時區域變數上的 UnboundLocalError 12 個答案 4天前關閉。
如果我運行這個腳本:
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() 里面的行。
但是如果我使用這兩行
print(b)并且b='value change'在nested_function() 中。像這樣:
def main_function():
b = 'b'
def nested_function():
print(b)
b = 'value change'
nested_function()
main_function()
然后,有一個錯誤。錯誤說:
UnboundLocalError:分配前參考的區域變數“b”
我無法理解為什么會發生這種情況的邏輯。
uj5u.com熱心網友回復:
讓我們一一分解。Python 的作用域規則有時有點精神錯亂。基本思想是,如果您曾經在給定函式內分配給變數,那么 Python 假定該變數是該特定函式的本地變數。
def main_function():
b = 'b'
def nested_function():
print(b)
nested_function()
main_function()
在這里,您永遠不會分配到binside nested_function,因此 Python 認為不需要創建新變數。相反,它從其封閉范圍繼承了一個。
def main_function():
b = 'b'
def nested_function():
b = 'value change'
nested_function()
main_function()
在這里,您確實對其進行了分配,因此您得到了一個新變數。b您分配給 inside of與inside ofnested_function無關。他們只是碰巧共享一個名字。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為其分配任何值之前列印出來,因此會出現錯誤。
如果b是模塊級變數,您將使用global關鍵字在函式內將其標記為這樣。在你的情況下,它是一個區域變數;它不是立即封閉函式的本地。所以我們使用nonlocal關鍵字。
def main_function():
b = 'b'
def nested_function():
nonlocal b
print(b)
b = 'value change'
nested_function()
main_function()
nonlocal b說“我知道我分配給b,但實際上我的意思是使用封閉范圍中的那個”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487564.html
上一篇:R:從相鄰行中的條目創建隨機樣本
下一篇:一次添加多個資料以回傳串列
