当我将'reversed'函数返回对象与'list'函数一起使用来创建列表时,它将删除其元素。
>>> a = [1,2,3,4,5]
>>> b = reversed(a)
>>> b
<list_reverseiterator object at 0x000001D9059A6438>
>>> c = list(b)
>>> c
[5, 4, 3, 2, 1]
>>> c
[5, 4, 3, 2, 1]
>>> list(b)
[]
第二个“列表(b)”删除程序的数据,因此我无法再次使用它的数据。 为什么会发生此问题?
答案 0 :(得分:1)
reversed
returns a reverse iterator(只能读取一次),而不是反向的序列(可以重复使用)。如果要制作任意序列的可重复使用的反向版本,请立即将其转换为list
(这样就看不到中间迭代器):
>>> a = [1,2,3,4,5]
>>> b = list(reversed(a))
或使用可逆切片(也保留原始序列的类型):
>>> a = [1,2,3,4,5]
>>> b = a[::-1]
答案 1 :(得分:1)
正如您在第一个输出中所看到的,reversed()
返回一个迭代器,而不是新列表。这就是为什么您需要调用list(b)
来获取实际列表的原因。
大多数迭代器只能使用一次。 *
每次从迭代器获取值时,它都会更新其内部状态以记住当前位置,以便下次获取时可以获取下一个值,依此类推。一旦结束,就别无其他东西了。
使用list(b)
时,list()
函数进入循环,从b
迭代器中获取所有值。完成后,迭代器位于其数据的末尾。如果您尝试再次使用它,则没有任何可获取的东西。无法将其重新设置为开始。
*一个例外是当您使用file
对象作为迭代器时。它使用自己的file
对象的状态来代替迭代器保持其自身的状态,并仅从当前文件位置执行一个readline()
调用。因此,您可以使用file.seek(0)
将迭代器重置为文件的开头。