带有“列表”功能的Python“反向”功能返回对象运行不正常

时间:2019-07-09 03:20:44

标签: python

当我将'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)”删除程序的数据,因此我无法再次使用它的数据。 为什么会发生此问题?

2 个答案:

答案 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)将迭代器重置为文件的开头。