没有在for循环中定义python全局变量



此代码给出错误:UnboundLocalError: local variable 'LINES' referenced before assignment,但LINES已明确初始化,因为如果我注释掉print语句下面的行,它不会抛出错误,并按预期打印len(lines) = 0。我是不是不了解蟒蛇??这是怎么回事?

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

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

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

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

你可以像这个一样检查foo

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

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

您需要使用global关键字:

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

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

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

LINES = []

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

正如所需登录所说,

由于您在示例函数中为LINES赋值,python知道不要使用全局变量,但您可以在定义该变量之前尝试访问该变量。

这还没有结束,您可以通过使用全局关键字来修复此问题,告诉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()

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

相关内容

  • 没有找到相关文章

最新更新