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

时间:2013-07-15 00:05:05

标签: python python-2.7 python-3.x global-variables

此代码提供错误: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 个答案:

答案 0 :(得分:4)

您可以从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')

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

答案 1 :(得分:3)

You need to use the global keyword:

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

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

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

LINES = []

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

答案 2 :(得分:0)

在查看全局(模块级别)范围之前,Python将首先查看变量的函数范围。由于您在示例函数中分配给LINES,因此python知道不使用全局变量,但在定义之前尝试访问此变量。您应该在print语句之前初始化LINES,或者省略LINES = []语句。

答案 3 :(得分:0)

正如Desired Login所说,

  

由于您在示例函数中指定了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()