python全局变量在这里发生了什么?

时间:2015-12-01 08:00:46

标签: python-2.7

有人可以向我解释为什么fails()中的代码会抛出异常吗?这是某种python 2.7自动升级为全局功能吗?

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 个答案:

答案 0 :(得分: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. 列表对象的所有索引,用一组空索引替换它们:

sess.run()