2015-12-01 36 views
0

有人可以向我解释为什么fails()中的代码会抛出异常?这是一些蟒蛇2.7自动提升到全球功能?python全局变量在这里发生了什么?

glist = [] 

def works(): 
    glist.append("one") 

def works2(): 
    for x in glist: 
     pass 
    glist.append("two") 

def fails(): 
    for x in glist: 
     pass 
    glist.append("failbot") 
    glist = [] 

if __name__ == "__main__": 
    works() 
    works2() 
    fails() 

抛出:

Traceback (most recent call last): 
    File "autoglobal.py", line 20, in <module> 
    fails() 
    File "autoglobal.py", line 12, in fails 
    for x in glist: 
UnboundLocalError: local variable 'glist' referenced before assignment 

回答

1

在Python中,函数名是全局性的,除非你让他们本地。你在功能之一做出glist地方通过分配给它:

def fails(): 
    for x in glist: 
     pass 
    glist.append("failbot") 
    glist = [] # direct assignment! 

凡是“结合”的名称,将会使该名称的地方;直接分配是一种方法,但使用名称的for循环(如上述函数中的x)也使该名称在当前范围内为本地名称。

通过将global glist添加到该功能,不会将该名称分配给该名称,而是分配给该分层。例如:

以下不指定名称,例如;而是分配给现有的glist列表对象的所有索引,将其替换为空集索引:

def fails(): 
    for x in glist: 
     pass 
    glist.append("failbot") 
    glist[:] = [] # clear the list, not rebind the name. 
+0

谢谢!我没有意识到这是清除列表的正确方法。 – portforwardpodcast