2011-02-14 78 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

相关问题