2014-10-10 101 views
2

有人可以解釋爲什麼下面的代碼在第12行(打印語句)產生一個錯誤「全局名稱」foobar'未定義「?我認爲我理解Python的範圍,但這是給我適合。Python:沒有定義全局名稱'foobar'

def main(): 
    # initialize 
    global foobar 
    foobar = Foo() 

class Foo(): 
    def __init__(self): 
    self.bar = Bar() 

class Bar(): 
    def __init__(self): 
    print foobar 

#Call main() when script is executed 
if __name__ == '__main__': main() 
+0

看起來你可能期待'全局foobar'來「聲明」一個變量並將其初始化爲默認值?變量在Python中不能以這種方式工作。所有'全局'的意思是「當你看到這個變量的賦值時,將它賦值爲全局而不是本地變量」。在這樣的任務發生之前,仍然沒有變量。 – abarnert 2014-10-10 01:25:58

回答

4

當時Foo()被調用時,foobar還沒有定義(它不會是直到Foo()回報和其返回值被分配到foobar。但是,foobar由電話訪問Foo(),因此,在執行print foobarBar.__init__時,全局foobar尚未定義,如果在撥打main之前設置值爲foobar,則會看到在Foo之前打印的值對象被分配。請嘗試以下

if __name__ == "__main__": 
    foobar = 3 
    foobar = Foo() # This will output "3" 
    print foobar # This will print something like <__main__.Foo object at 0x.....> 

作爲abarnert指出的,global foobar不創建變量foobar;它只是確保在全局範圍內創建由以下分配創建的變量,而不是在main中的局部變量。

+0

我有一種感覺,可能是這種情況。謝謝。 – Phl3tch 2014-10-10 11:42:47

2

global foobar需要參考已存在的foobar

例如

foobar = 0 

def foo(): 
    global foobar 
    print (foobar) #python 3 
相關問題