2017-02-11 178 views
0

一個名單上有列出的以下列表:Python列表理解:壓扁列表的列表返回的5S

>>>> vec=[[1,2,3],[4,5,6],[7,8,9]] 

要使用列表理解壓扁列出的清單,我可以使用:

>>>>[i for k in vec for i in k] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

但如果我寫:

>>>> [i for k in vec] 
[5,5,5] 
>>>> [i for k in vec for k in k] 
[5, 5, 5, 5, 5, 5, 5, 5, 5] 

甚至改變vec=[[2,89,6],[34,7,10],[812,55,7],[76765,34,99]]

>>>> [i for k in vec] 
[5,5,5,5] 
>>>> [i for k in vec for k in k] 
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 

那麼發生了什麼事?這些5是從哪裏來的?

+0

'i'無關與您的清單,因爲你不使用它作爲一個循環變量。它仍然具有與您使用它完全無關的事情的'5'值。 – user2357112

+0

我不知道你是如何得到這個結果的,但[我爲vec中的k]給出了一個錯誤:「i」沒有被定義... –

+1

單獨嘗試'i' - 在列表理解之外。打賭它是5. – dawg

回答

2

如果您在使用Python 3標記此問題時,您必須在某個時間點將i重新設爲5。在Python 3個listcomps有自己的範圍,所以你所示的命令甚至不會工作:

>>> vec=[[1,2,3],[4,5,6],[7,8,9]] 
>>> [i for k in vec for i in k] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> i 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'i' is not defined 
>>> [i for k in vec] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <listcomp> 
NameError: name 'i' is not defined 

因爲listcomp不設置i任何東西,它試圖從外部獲得的值範圍,和(不像你:-)我沒有設置任何東西。

通過對比的方式,在Python 2,i將從[i for k in vec for i in k] listcomp泄漏,你會風與

>>> [i for k in vec] 
[9, 9, 9] 
>>> [i for k in vec for k in k] 
[9, 9, 9, 9, 9, 9, 9, 9, 9] 
+0

啊你是完全正確的!多麼尷尬! :■ –