簡體   English   中英

Python中的liveth聲明了但未定義的全局變量?

[英]Where liveth declared but undefined global variables in Python?

當您聲明變量是全局變量時,它不會為您創建變量(如果尚不存在)。 全局語句實際上對變量有什么作用? 顯然,它並不僅僅是修改它,因為它不必存在就可以修改。 一旦超出范圍,就可以

def foo():
    global cat, dog
    dog = 1

foo()
print('dog' in globals())  # => True
print(dog)  # => 1
print('cat' in globals())  # => False
print(cat)  # => NameError

這也會引發一個錯誤(不足為奇):

def foo():
    global cat, dog
    dog = 1

def bar():
    cat = 2

foo()
bar()
print(dog)
print(cat)  # => NameError

因此,顯然,全局修飾符僅在所執行函數的范圍內起作用。 無論如何,這是由垃圾收集器引起的嗎? 是否有一些幻影化的全球化對象等待創建具有給定名稱的對象並在函數結束時被清除?

全局語句實際上對變量有什么作用?

絕對沒有。

global foo表示在函數范圍內出現的任何變量名稱foo都是指模塊全局foo變量,而不是局部函數調用變量。 它對變量本身沒有任何作用。

至於這些變量所處的位置,它們並沒有真正“存在”於任何地方。 分配了此類變量后,將在模塊的全局變量dict中為它們創建一個條目。 如果del了變量,則將刪除全局變量dict條目。 這是相同的會發生什么,如果你被分配和del eting在模塊級這些變量沒有一個global的聲明。

全局是解析器的指令。

文件所記載。 這意味着它不會改變任何東西。 還要注意,“它僅適用於與全局語句同時解析的代碼”。 可以在下面的示例中進行測試

a=3
def foo():
  exec('global a')
  a=4

foo()
print(a) # 3

如果global如您所說是修飾符,則最后一行將顯示4。但是事實並非如此。

暫無
暫無

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

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