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

3
这段代码出现了错误:UnboundLocalError: local variable 'LINES' referenced before assignment,但是LINES已经被初始化了。如果我把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个回答

6

您可以在foo内部访问全局变量,但如果没有使用global关键字,则无法重新绑定它们。

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

当您尝试使用LINES = []进行赋值时,Python知道需要在函数的本地变量中创建一个条目以供LINES使用。由于您正在尝试在分配任何内容到本地变量之前使用len(LINES),这会导致错误。

您可以像这样检查foo

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

如果你再次定义foo而没有LINES = [],你会发现Python不再将其标记为局部变量。

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会将其视为一个局部变量。

我明白了。但是为什么当LINES = []被注释掉或替换为LINES.append(prob)时它就能工作呢? - anthonybell

1

正如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()

0

Python 会先在函数作用域中查找变量,然后再查找全局(模块级别)作用域。由于您在示例函数中对 LINES 进行了赋值,因此 Python 知道不要使用全局变量,但是您在定义变量之前尝试访问该变量。您应该在打印语句之前初始化 LINES,或者省略 LINES = [] 语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接