[英]Why the code has different behavior in python2 and python3?
當我們使用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))
在 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))
您的值c
被迭代了兩次。 在第一次打印中轉換為列表一次,在 for 循環中第二次轉換為列表。
在 Python 2 中, zip(a,b)
返回一個列表,可以多次迭代它沒有問題。
在 Python 3 中, zip(a,b)
返回一個zip
對象,它是一個迭代器。 這個迭代器在你第一次迭代時被有效地“用完”,當 for 循環運行時,它沒有剩余的項目可以讓出,因此循環體不會執行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.