2017-02-11 91 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

啊你是完全正确的!多么尴尬! :■ –