簡體   English   中英

Python全局變量和局部變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM