我在列表理解上有以下代码。
x = 2
y = 3
[x*y for x in range(x) for y in range(y)]
这给我以下错误
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
[x*y for x in range(x) for y in range(y)]
File "<pyshell#35>", line 1, in <listcomp>
[x*y for x in range(x) for y in range(y)]
UnboundLocalError: local variable 'y' referenced before assignment
但是,下面的代码可以使用。
[x*y for x in range(x)]
[0, 5]
列表理解中的第二个for
循环是否有任何范围规则?
我正在使用Python 3.6。
答案 0 :(得分:1)
很好的问题,但是此代码在Python2.x
中效果很好,并会在UnboundLocalError
中抛出Python3.x
。
以前获取 UnboundLocalError 会令人感到意外 通过添加赋值语句修改它时的工作代码 在函数体中的某个地方。
这是因为当您对范围中的变量进行分配时,该变量将变为该范围的本地变量,并隐藏外部范围中任何类似命名的变量。由于它为x赋值,因此编译器将其识别为局部变量。因此,较早的变量尝试打印未初始化的局部变量并产生错误。
查看Why am I getting an UnboundLocalError when the variable has a value?的更多详情。