[英]Free variables treated as globals in Python?
在Python 3.7參考手冊的“ 執行模型”部分中,我閱讀了以下語句:
global
語句的作用域與同一塊中的名稱綁定操作相同。 如果最接近的自由變量包圍范圍包含global
語句,則將自由變量視為global
語句。
因此,我在Python解釋器中輸入了以下代碼:
x =0
def func1():
global x
def func2():
x = 1
func2()
調用func1()
我希望全局范圍內的x
值更改為1
。
我怎么了?
func2
x = 1
不是自由變量 。 這只是另一個當地人。 您將綁定到該名稱,默認情況下,綁定的名稱是本地人,除非您另行告訴Python。
從相同的執行模型文檔中 :
如果名稱綁定在塊中,則除非聲明為
nonlocal
或global
,否則它是該塊的局部變量。 [...] 如果變量在代碼塊中使用但未在代碼塊中定義,則它是一個自由變量。
( 加粗強調我的 )
您將塊中的名稱與x = 1
綁定在一起,因此它是該塊中的局部變量,並且不能是自由變量。 因此,您發現的部分不適用,因為這僅適用於自由變量:
如果最接近的自由變量包圍范圍包含
global
語句,則將自由變量視為global
語句。
您不應在func2()
綁定x
,因為只有未在范圍內綁定的名稱才是自由變量。
所以這有效:
>>> def func1():
... global x
... x = 1
... def func2():
... print(x) # x is a free variable here
... func2()
...
>>> func1()
1
>>> x
1
func2
x
現在是一個自由變量; 它不是在func2
的范圍內定義的,因此請從父范圍中選擇它。 此處的父作用域是func1
,但是x
被標記為全局范圍,因此當為print()
函數讀取 x
,將使用全局值。
與此相反, x
在func1
沒有被標記為全局func1
:
>>> def func1():
... x = 1
... def func2():
... print(x) # x is free variable here, now referring to x in func1
... func2()
...
>>> x = 42
>>> func1()
1
此處,全局名稱x
設置為42
,但這並不影響打印的內容。 func2
中的x
是一個自由變量,但父作用域func1
僅將x
作為本地名稱。
當您添加新的最外部作用域(其中x
仍然是本地的)時,它變得更加有趣 。
>>> def outerfunc():
... x = 0 # x is a local
... def func1():
... global x # x is global in this scope and onwards
... def func2():
... print('func2:', x) # x is a free variable
... func2()
... print('outerfunc:', x)
... func1()
...
>>> x = 42
>>> outerfunc()
outerfunc: 0
func2: 42
>>> x = 81
>>> outerfunc()
outerfunc: 0
func2: 81
x
中的outerfunc
是有界的,因此不是自由變量。 因此,它在該范圍內是本地的。 然而,在func1
,在global x
聲明標記x
作為嵌套斯克羅普一個全球性的。 在func2
x
是一個自由變量,根據找到的語句,它被視為全局變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.