2014-10-10 103 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 
相关问题