当*
的输入是2D列表时,我试图理解使用zip
解包参数的必要性。 docs州,
[zip]返回元组的迭代器,其中第i个元组包含来自每个参数序列或迭代的第i个元素。
所以,关于下面的第二个print
声明,我预计它就像之前和之后的声明一样。我无法将zip
的说明与此结果相关联。
MWE:
x = [1, 2, 3]
y = [4, 5, 6]
print zip(x, y)
print zip([x, y]) # don't understand this result
print zip(*[x, y])
结果:
[(1, 4), (2, 5), (3, 6)]
[([1, 2, 3],), ([4, 5, 6],)]
[(1, 4), (2, 5), (3, 6)]
答案 0 :(得分:5)
考虑这个例子:
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> z = [7, 8, 9]
>>> zip(x,y,z)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> zip(x,y)
[(1, 4), (2, 5), (3, 6)]
>>> zip(x)
[(1,), (2,), (3,)]
>>> zip()
[]
使用单个参数(甚至没有参数!)观察zip
遵循相同的模式。它总是返回一系列元组,其中元组(如果有的话)与zip
的参数具有相同数量的成员。即使zip
只有一个参数。
现在考虑一下你问的问题:
zip([x, y])
只有zip
只有一个参数! Zip
不会试图变得聪明,并且在你给它的序列的元素内部戳。它不知道或不关心你给它的序列的元素本身是序列。 Zip
(谢天谢地!)简单且可预测。如果你给它一个参数,它会返回一个1元组的序列。在这种情况下,这些1元组每个都包含一个列表,但同样,zip
并不关心!它们可以是字符串或数字或None
或任何东西!
>>> zip([x, y])
[([1, 2, 3],), ([4, 5, 6],)]
>>> zip([x, 'marmalade'])
[([1, 2, 3],), ('marmalade',)]
>>> zip([None, y])
[(None,), ([4, 5, 6],)]