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