当我们使用python2运行以下代码时,结果为
[(1, 2), (2, 3), (3, 4)]
m: 1, n: 2
m: 2, n: 3
m: 3, n: 4
否则,使用python3
[(1, 2), (2, 3), (3, 4)]
我认为python3的结果没有道理吗?有人可以告诉我为什么吗?
a = [1, 2, 3]
b = [2, 3, 4]
c = zip(a,b)
print(list(c))
for (m,n) in list(c):
print('m: {}, n: {}'.format(m, n))
答案 0 :(得分:5)
在Python 3中,zip
(以及其他一些功能,例如map
)返回单次迭代器。所以,这是怎么回事:
c = zip(a, b)
,但尚未评估c
(这意味着a
和b
上的迭代此时尚未发生)。 print(list(c))
遍历c
的元素,直到到达迭代器的末尾。 c
现在“用尽了”:
>>> a = [1, 2, 3]
>>> b = [2, 3, 4]
>>> c = zip(a,b)
>>> print(list(c))
[(1, 2), (2, 3), (3, 4)]
>>> next(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
看看呼叫next(c)
如何提高StopIteration
?这就是您第二次调用list(c)
时发生的情况,因此它返回一个空列表:
>>> list(c)
[]
解决难题的一种方法是立即(仅一次)将迭代器转换为列表:
a = [1, 2, 3]
b = [2, 3, 4]
c = list(zip(a,b))
print(c)
for (m,n) in c:
print('m: {}, n: {}'.format(m, n))
答案 1 :(得分:0)
您的值c
被迭代两次。在第一次打印时转换为列表一次,在for循环中第二次转换为列表。
在Python 2中,zip(a,b)
返回一个列表,可以对其进行多次遍历。
在Python 3中,zip(a,b)
返回一个zip
对象,它是一个迭代器。第一次迭代该迭代器时,它会被有效地“用完”,并且在for循环运行时,它没有剩余的任何内容,因此循环体无法执行