簡體   English   中英

自由變量在Python中被視為全局變量嗎?

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

相同的執行模型文檔中

如果名稱綁定在塊中,則除非聲明為nonlocalglobal ,否則它是該塊的局部變量。 [...] 如果變量在代碼塊中使用但未在代碼塊中定義,則它是一個自由變量。

加粗強調我的

您將塊中的名稱與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 ,將使用全局值。

與此相反, xfunc1沒有被標記為全局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.

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