簡體   English   中英

為什么代碼在 python2 和 python3 中有不同的行為?

[英]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尚未被評估(意味着此時不會發生對ab的迭代)。
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM