在Python3中混淆了zip(* zip(x,y)),*运算符可以解压缩迭代器吗?

时间:2016-11-08 15:39:05

标签: python

官方Python3文档说:

  

zip()与*运算符一起用于解压缩列表

但也说,zip()是“创建一个迭代器,聚合每个迭代的元素”

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)

x2, y2 = zip(*zip(x, y))

我对最后一行zip(*zip(x, y))感到困惑,zip(x, y)返回一个可迭代对象,而不是列表。 *zip(x, y)如何运作!?如何*upzip一个迭代器!?

1 个答案:

答案 0 :(得分:1)

这是在最后一个语句中发生的事情。内部zip

zip(x, y) 

...导致可迭代超过([1,4], [2,5], [3,6])。然后这个:

zip(*zip(x, y))

转换为:

zip([1,4], [2,5], [3,6])

...因为星号消耗了iterable并传播了值,因此它们成为外部zip函数的单独参数。

该表达式被评估为可迭代的两个值:

([1, 2, 3], [4, 5, 6])

...需要分配(解包)两个变量(分别为x2y2),因此这两个值都是从迭代中消耗的。