[英]why python can't access global variable value with function parameter name change?
在這兩段代碼中,為什么第二段給出局部變量賦值錯誤? 兩個代碼相似,只是 function 參數不同,在第二個中它能夠讀取全局變量,為什么不在第一個中隨着參數名稱的變化而改變符號表?
第一:
def a(z):
z+=1
z=3
a(z)
第二個:
def a(z):
b += 1
b = 5
a(b)
您應該將def
塊視為獨立的。
在第一個片段中:
def a(z):
z+=1
z
是什么? 這是a
的第一個參數
在第二個片段中:
def a(z):
b += 1
什么是b
? 這是未知的。 這就是此代碼失敗的原因。
您還應該注意到,在您的第一個片段中, function 中的z
與z=3
不同:
>>> def a(z):
... z+=1
...
>>> z=3
>>> a(z)
>>>
>>> z
3
這里沒有使用任何全局變量。
在第一個示例中, z
是 function 的參數,而不是全局參數。 請注意,當您增加z
時,它不會在調用 scope 中發生變化,因為 function 內部的z
是您從 ZC1C425268E68385D1AB5074C17A94F 外部傳入的z
的副本。
在第二個示例中, function 中沒有b
(參數為z
),這就是為什么當您嘗試修改 function 時會出現錯誤的原因。
要執行您想要執行的操作,您應該將參數設置為可變的 object ,其中包含您要更改的值; 這樣您就可以修改 function 中的值,調用者將可以訪問新值。 您可以為此目的定義一個 class ,或者您可以簡單地將其設為單元素列表:
def a(z):
z[0] += 1
b = [5]
a(b) # b == [6]
或者,如果可能,更好的方法 IMO 不依賴於可變性,而只返回新值,要求調用者在其 scope 中明確地重新分配它:
def a(z)
return z + 1
b = 5
b = a(b) # b == 6
在第二個代碼中,參數是“z”,您嘗試使用“b”訪問該參數
def a(z):
b += 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.