为什么这个zip()代码示例具有不同的输出?

时间:2018-10-02 12:12:19

标签: python itertools

据我所知,在两种情况下,我们都将拆包3个相同的迭代器,但是输出是不同的。
在第一种情况下,由于某种原因,它类似于list(zip(c[::3], c[1::3], c[2::3])),在第二种情况下,其行为类似于普通的zip()

c = [[a, b] for a, b in itertools.product(list(range(3)), list(range(3)))]

# first example
list(zip(*[iter(c)] * 3))
>[([0, 0], [0, 1], [0, 2]), ([1, 0], [1, 1], [1, 2]), ([2, 0], [2, 1], [2, 2])]

# second example
list(zip(*[iter(c), iter(c), iter(c)]))
>[([0, 0], [0, 0], [0, 0]),
 ([0, 1], [0, 1], [0, 1]),
 ([0, 2], [0, 2], [0, 2]),
 ([1, 0], [1, 0], [1, 0]),
 ([1, 1], [1, 1], [1, 1]),
 ([1, 2], [1, 2], [1, 2]),
 ([2, 0], [2, 0], [2, 0]),
 ([2, 1], [2, 1], [2, 1]),
 ([2, 2], [2, 2], [2, 2])]

1 个答案:

答案 0 :(得分:3)

您的第一个示例与

相同
it = iter(c)
print(list(zip(*[it, it, it])))  # == list(zip(it, it, it))

这与您创建3个新迭代器的第二个示例list(zip(iter(c), iter(c), iter(c))不同。

每次next上调用it时,都会影响下次使用it时的情况。

在第二个示例中,这3个迭代器独立运行。