Python 列表理解:扁平化列表列表会返回 5 的列表



我有以下列表列表:

>>>> 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]

最新更新