Python列表理解:压扁列表的列表返回的5S
问题描述:
一个名单上有列出的以下列表: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是从哪里来的?
答
如果您在使用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
啊你是完全正确的!多么尴尬! :■ –
'i'无关与您的清单,因为你不使用它作为一个循环变量。它仍然具有与您使用它完全无关的事情的'5'值。 – user2357112
我不知道你是如何得到这个结果的,但[我为vec中的k]给出了一个错误:“i”没有被定义... –
单独尝试'i' - 在列表理解之外。打赌它是5. – dawg