2016-06-07 78 views
0

當你聲明一個變量是全局變量時,它不會爲你創建它(如果它不存在的話)。全球聲明實際上對變量做了什麼?它顯然不僅僅是修改它,因爲它不需要修改它。一旦超出範圍,可以在Python中聲明瞭哪些liveth全局變量但未定義全局變量?

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 

所以,很顯然,全球僅修改函數的範圍內工作的執行。這是否是由垃圾收集器造成的?是否有一些幻像的globalizer對象等待創建具有給定名稱的對象,並在函數結束時被清除?

+0

對,但在給狗分配值之前,沒有狗的情況。 – Goodies

+0

我的觀點是,它顯然不是直接修改狗,因爲狗在全球聲明之前並不存在。你不能修改不存在的東西。 – Goodies

+0

垃圾回收器與它無關。 'global'只是不創建變量。如果你在'foo()'中的globals()'中檢查'「cat」,它將會回答false。 – gdlmx

回答

2

全局陳述實際上做的變量是什麼?

絕對沒有。

global foo意味着在函數範圍內變量名稱foo的任何出現都指代模塊全局foo變量而不是函數調用局部變量。它對變量本身沒有任何影響。

至於這些變量存在的地方,他們並不真正「活」在任何地方。當這樣的變量被賦值時,將在模塊的全局變量dict中爲它們創建一個條目。如果變量爲del eted,全局變量dict條目將被刪除。這與如果您正在分配並且在模塊級別使用這些變量而沒有聲明global會發生什麼相同。

1

全局是解析器的指令。

寫在doc。這意味着它不會改變任何東西。另請注意,「它僅適用於與全局語句同時分析的代碼」。這可以在下面的例子中

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

foo() 
print(a) # 3 

測試如果global是修改如你所說,那麼最後一行將打印4.但事實並非如此。