2017-03-03 102 views
2

我在列表理解上有以下代码。UnboundLocalError:分配前引用的局部变量'y'

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

@Chris_Rands:可能的重复帖子不讨论UnboundLocalError和列表理解的范围规则。 –

回答

1

不错的问题,但是这个代码在Python2.x中效果很好,它会在Python3.x中抛出UnboundLocalError

It can be a surprise to get the UnboundLocalError in previously working code when it is modified by adding an assignment statement somewhere in the body of a function.

这是因为当你在一个范围进行分配给一个变量,该变量变得局部的范围和阴影在外部范围任何类似的命名变量。由于它为x分配了一个新值,编译器将其识别为本地变量。因此,较早的变量尝试打印未初始化的本地变量并产生错误。

Why am I getting an UnboundLocalError when the variable has a value?查看更多详情。

+0

好吧,这意味着循环确实有一个本地范围的列表理解?根据我对循环的理解,在模块级别创建时不会创建任何本地范围。 –

相关问题