簡體   English   中英

Python如何處理全局變量?

[英]How does Python handle globals?

我在Python中遇到了一些奇怪的全局變量處理。 我希望有人可以解釋並證明這些驚喜!

A)此代碼按預期打印10:

def func():
  print(a)
a = 10
func()

B)此代碼引發了一個過早引用的異常:

def func():
  print(a)
  a += 1
a = 10
func()

C)但是這段代碼按預期打印[10]:

def func():
  print(a)
  a.append(1)
a = [10]
func()

所以,我可以收集該類型a改變其范圍,並且還沒有達到尚未改怎么還后聲明a看到。 我知道我可以在函數的開頭使用global a ,但它相當冗長。

任何人都可以告訴我Python正在使用哪些規則來處理其奇怪的范圍?

第二個實例重新綁定 a ,因此編譯器為其生成本地訪問。 另外兩個只讀取a ,因此執行正常的全局范圍搜索。

基本上,有兩個規則:

  1. 當您只讀取變量(在范圍內)時,Python將沿着范圍鏈向上移動,直到找到該名稱的變量。
  2. 當您至少寫入一次變量時,Python將始終在當前范圍內創建變量。

但是,您可以更改#2的行為:

  • 如果希望名稱引用模塊級變量,則可以使用global my_module_variable 當您現在寫入my_module_variable ,Python將不會創建局部變量。
  • 從Python 3開始,您還可以使用名稱引用封閉范圍中的變量:使用nonlocal my_non_local_variable使其引用最近的封閉范圍中的變量。

代碼中的問題

B)您正在使用+= :您正在嘗試寫入變量。 因此規則2生效,它將寫入當前范圍中的變量。 但是,它也必須從中讀取( print(a) ),但該變量還沒有值,因為您之前沒有寫過它。 Python不允許您在函數中混合規則1.和規則2.

如果你想讓func()處理a = 10變量,你可以改變你的代碼:

>>>> def func()
        global a
        print(a)
        a += 1
>>>> a = 10
>>>> func()
10
>>>> func()
11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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