for循环中未定义python全局变量

ant*_*ell 3 python global-variables python-2.7 python-3.x

这段代码给出了错误:UnboundLocalError: local variable 'LINES' referenced before assignmentLINES显然是初始化的,因为如果我注释掉打印语句下面的行,它不会抛出任何错误并按len(lines) = 0预期打印 。我是不是对 python 不了解?这里发生了什么?

LINES = []

def foo():
  for prob in range(1,3):
    print "len(lines) = %d" % len(LINES)
    LINES = []

if __name__ == "__main__":
  foo()
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 6

您可以从 inside访问全局变量foo,但除非使用global关键字,否则无法重新绑定它们

因此,您可以使用LINES.append(...)LINES[:] = []因为它们只是修改 LINES 引用的列表。

当您尝试分配LINESusing 时LINES = [],Python 知道它需要在函数局部变量中为 LINES 创建一个条目。由于您len(LINES)在将任何内容分配给局部变量之前尝试使用,因此会导致错误

您可以检查foo这样的

>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
('prob', 'LINES')
Run Code Online (Sandbox Code Playgroud)

如果您在foo没有 的情况下再次定义LINES = [],您将看到 Python 不再将其标记为局部变量。


jh3*_*314 5

您需要使用global关键字:

def foo():
  global LINES
  for prob in range(1,3):
    print "len(lines) = %d" % len(LINES)
    LINES = []
Run Code Online (Sandbox Code Playgroud)

否则,Python 会认为这LINES是本地的,并且在将其设置为之前打印出该值[]将是一个问题

您可以LINES通过打印出来获取全局变量的值,但是当您有语句时

LINES = []
Run Code Online (Sandbox Code Playgroud)

它试图设置LINES为一个新列表,Python 将其解释为局部变量