python list(zipobject) 返回空(列表)容器

Don*_*onD 5 python list

我在 Python 3.4.3 中遇到了一个奇怪的问题,似乎没有任何地方提到它。

让我们说:
a = [1,2,3,4]b = [5,6,7,8]

要垂直连接这些:ab = zip(a,b) 在 python 3 中,ab它本身将返回:

zip 对象位于(一些十六进制数)

一切都好,在python 3中,检索连接列表:
aabb = list(ab)

现在问题来了,第一次,aabb确实会返回一个真正的列表:
[(1, 5), (2, 6), (3, 7), (4, 8)]

然而,第二次及以后,如果你再次执行整个过程,list(aabb)只会返回一个空[]容器,就像list()会做的那样。

只有在我重新启动 shell/解释器后它才会再次工作。

这是正常现象还是bug?

编辑:玉家伙我并没有意识到这是一起做的zip,它似乎常数ab返回相同的十六进制值,每次所以我认为这是一起做的list(ab)

无论如何,通过重新分配解决了 ab = zip(ab)

根据我在答案和原始链接中的理解,ab一旦阅读就会被处理掉。

Mal*_*imi 4

这个问题不会由您的代码创建list(aabb),但list(ab)现在会在您的代码中创建:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]

ab = zip(a, b)
aabb = list(ab)

print(list(ab))  # -> []
Run Code Online (Sandbox Code Playgroud)

问题是zip迭代只存储一次值,然后像这样处理:

ab = zip(a, b)  # iterator created
aabb = list(ab)  # elements read from ab, disposed, placed in a list

print(list(ab))  # now ab has nothing because it was exhausted
Run Code Online (Sandbox Code Playgroud)

另一方面,这应该可以工作,因为aabb它只是一个列表,而不是耗尽的迭代器ab

ab = zip(a, b)
aabb = list(ab)

print(list(aabb))  # -> [(1, 5), (2, 6), (3, 7), (4, 8)]
Run Code Online (Sandbox Code Playgroud)