3

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

LINES = []

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

if __name__ == "__main__":
  foo()
4

4 回答 4

6

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

所以你可以使用LINES.append(...)orLINES[:] = []因为他们只是修改 LINES 引用的列表。

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

你可以foo像这样检查

>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
('prob', 'LINES')

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

于 2013-07-15T00:17:32.737 回答
5

您需要使用global关键字:

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

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

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

LINES = []

尝试设置LINES为新列表,Python 将其解释为局部变量

于 2013-07-15T00:07:49.713 回答
1

正如所需登录所说,

由于您在示例函数中分配给 LINES,python 知道不使用全局变量,但您在定义它之前尝试访问此变量。

这还没有结束,你可以通过使用 global 关键字来解决这个问题,告诉 python函数内部与函数外部LINES相同LINES

尝试:

LINES = []

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

if __name__ == "__main__":
  foo()
于 2013-07-15T00:27:02.027 回答
0

Python 将首先在函数范围内查找变量,然后再在全局(模块级)范围内查找。由于您LINES在示例函数中赋值,python 知道不使用全局变量,但您在定义它之前尝试访问该变量。您应该LINES在打印语句之前进行初始化,或者省略该LINES = []语句。

于 2013-07-15T00:20:46.143 回答