2017-03-03 55 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

好吧,這意味着循環確實有一個本地範圍的列表理解?根據我對循環的理解,在模塊級別創建時不會創建任何本地範圍。 –

相關問題