簡體   English   中英

為什么迭代器打印出來后會丟失內容?

[英]Why does an iterator lose its content after being printed out?

當我嘗試打印迭代器的內容時​​,它們消失了。 這是預期的行為嗎?

#!/usr/bin/env python3
string="foobarbaz" # Only as an example.

characters = string.encode('ISO-8859-1')
iterator = zip(characters[1:], characters)
iteratora = zip(characters[1::2], characters[::2])
iteratorb = zip(characters[2::2], characters[1::2])
# print(list(iterator))
# print(list(iteratora))
# print(list(iteratorb))
elements = [x + 2 * y if index % 2 else x * y
            for index, (x, y) in enumerate(iterator)]
hex((sum(elements) + characters[0]) % 0x10000)

上面的代碼按預期運行並返回以下內容:

'0xac66'

現在,我想取消注釋第一行打印,因此代碼將如下所示:

#!/usr/bin/env python3

string="foobarbaz" # Only as an example.

characters = string.encode('ISO-8859-1')
iterator = zip(characters[1:], characters)
iteratora = zip(characters[1::2], characters[::2])
iteratorb = zip(characters[2::2], characters[1::2])
print(list(iterator))
# print(list(iteratora))
# print(list(iteratorb))
elements = [x + 2 * y if index % 2 else x * y
            for index, (x, y) in enumerate(iterator)]
hex((sum(elements) + characters[0]) % 0x10000)

現在它返回這個:

'0x66'

print語句中的list轉換是否改變了iterator的原始值?

list(iterator)消耗迭代器。 因此,當取消注釋print(list(iterator))elements將是一個空列表:

string = "foobarbaz"
characters = string.encode('ISO-8859-1')
iterator = zip(characters[1:], characters)
print(list(iterator))
# [(111, 102), (111, 111), (98, 111), (97, 98), (114, 97), (98, 114), (97, 98), (122, 97)]

elements = [x + 2 * y if index % 2 else x * y
            for index, (x, y) in enumerate(iterator)]

print(elements)
# []

相比:

string = "foobarbaz"

characters = string.encode('ISO-8859-1')
iterator = zip(characters[1:], characters)
elements = [x + 2 * y if index % 2 else x * y
            for index, (x, y) in enumerate(iterator)]
print(elements)
# [11322, 333, 10878, 293, 11058, 326, 9506, 316]

如果你想打印iterator你應該深度復制它:

import copy

.
.
print(list(copy.deepcopy(iterator)))
.
.

另一種方法是在嘗試打印之前將iterator轉為列表:

.
.
iterator = list(zip(characters[1:], characters))
print(iterator)
# [(111, 102), (111, 111), (98, 111), (97, 98), (114, 97), (98, 114), (97, 98), (122, 97)]
elements = [x + 2 * y if index % 2 else x * y
            for index, (x, y) in enumerate(iterator)]

print(elements)
# [11322, 333, 10878, 293, 11058, 326, 9506, 316]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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