[英]Python global and local variables
在Python 2.7中,運行以下代碼:
def f():
a = a + 1
f()
給出以下結果:
Traceback (most recent call last):
File "test.py", line 4, in <module>
f()
File "test.py", line 2, in f
a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment
但是,如果我將代碼更改為:
def f():
a[0] = a[0] + 1
f()
我得到了不同的錯誤:
Traceback (most recent call last):
File "test.py", line 4, in <module>
f()
File "test.py", line 2, in f
a[0] = a[0] + 1
NameError: global name 'a' is not defined
為什么Python考慮a
是一個局部變量,當它是一個int
,全局list
? 這背后的理由是什么?
PS:我在讀完這個帖子后正在做實驗。
密鑰可在賦值語句的文檔中找到:
如下遞歸地定義對象到單個目標的分配。
如果目標是標識符(名稱) (例如
a = a + 1
) :
- 如果名稱未出現在當前代碼塊的全局語句中:名稱綁定到當前本地名稱空間中的對象。
- 否則:名稱綁定到當前全局命名空間中的對象。
如果已經綁定,該名稱將被反彈。 這可能導致先前綁定到名稱的對象的引用計數達到零,從而導致對象被釋放並且其析構函數(如果有的話)被調用。
...
如果目標是訂閱(例如
a[0] = a[0] + 1
) :評估引用中的主表達式。 它應該產生可變序列對象(例如列表)或映射對象(例如字典)。 接下來,評估下標表達式。
在f
1中, Python看到您將某個值綁定到a
,看到a
未在此范圍內的global a
語句中使用並准備局部變量。 然后它嘗試計算表達式a + 1
,查找變量a
並找到未初始化的局部變量。 這會導致UnboundLocalError
。
在f
2中, Python看到您正在為變量a
的訂閱分配一些值。 它在本地命名空間中查找該變量並且無法找到它。 然后它會遍歷非本地命名空間(閉包),直到它到達全局命名空間。 一旦它未能找到a
全局命名空間,它拋出一個NameError
。
你可以嘗試做這樣的事情:
def f(a):
a += 1
print a
def g():
a = 3
f(a)
g()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.