2011-02-14 61 views
3

在Python中,以下工作正常:爲什麼分配的變量名會影響值的查找?

def test_foo(): 
    class Foo(object): 
     pass 
    class Fam(object): 
     bar = Foo 

test_foo() 

但是下面的失敗,NameError: name 'Foo' is not defined

def test_foo(): 
    class Foo(object): 
     pass 
    class Fam(object): 
     Foo = Foo 

test_foo() 

爲什麼我指定名稱影響屬該值的查找分配?

回答

6

僅在類定義中指定名稱Foo這一事實使名稱Foo成爲該範圍(即該類的範圍)中的本地名稱。在解析和編譯爲字節碼時,本地名稱是靜態確定的。當執行達到聲明時

Foo = Foo 

Python首先評估右邊。它查找本地名稱Foo - 在編譯期間確定 - 並且無法在本地範圍內找到它。因此錯誤。

同樣會發生,如果你想嘗試

def test_foo(): 
    foo = 3 
    class A: 
     bar = foo 
     foo = 42 

test_foo() 
+2

爲清晰起見,你可能會考慮將上面的代碼在`高清test_foo():`塊。當完全按照書面輸入(在模塊的全局範圍內使用`foo`)時,此代碼不會產生錯誤! – senderle 2011-02-15 05:06:13

相關問題