Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环中未定义python全局变量_Python_Python 2.7_Python 3.x_Global Variables - Fatal编程技术网

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

for循环中未定义python全局变量,python,python-2.7,python-3.x,global-variables,Python,Python 2.7,Python 3.x,Global Variables,此代码给出错误:UnboundLocalError:赋值前引用的局部变量“LINES”,但是LINES已明确初始化,因为如果我注释掉print语句下面的行,它不会抛出错误,并按预期打印len(LINES)=0。我是不是对python有些不了解??这是怎么回事 LINES = [] def foo(): for prob in range(1,3): print "len(lines) = %d" % len(LINES) LINES = [] if __name__ ==

此代码给出错误:
UnboundLocalError:赋值前引用的局部变量“LINES”
,但是
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()

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

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

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

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

因此,您可以使用
行。追加(…)
行[:]=[]
,因为它们只是在修改行引用的列表

当您尝试使用
LINES=[]
行赋值时,Python知道它需要为函数局部变量中的行创建一个条目。由于在为局部变量赋值之前尝试使用
len(LINES)
,因此会导致错误

您可以像这样检查
foo

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

如果再次定义
foo
而没有
行=[]
,您将看到Python不再将其标记为局部变量。

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

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

这还没有结束,您可以通过使用全局关键字来解决这个问题,告诉python函数中的
与函数外部的
相同

尝试:


我懂了。但是,当
行=[]
被注释掉或替换为
行时,为什么它会起作用呢?
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
('prob', 'LINES')
LINES = []

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

if __name__ == "__main__":
  foo()