我正在编写一个程序,不断要求用户输入名称,直到输入END为止,这时它将以相反的顺序打印出名称列表。
最初,我不知道如何以相反的顺序打印列表,所以我发现了这一点:在Python中以相反的顺序遍历列表
我决定使用reversed()
内置功能:
import getpass
import time
import sys
print("Welcome " + getpass.getuser() + "...")
time.sleep(0.25)
print("This program, powered by Python, it will ask you to enter names...")
time.sleep(0.5)
print("...once you have finished, enter END to print off your list")
names = []
while True:
name = input("Please enter a name: ")
if name == "END":
print(reversed(names))
sys.exit()
names.append(name)
但是,它显示的全部是:
<list_reverseiterator object at 0x0000000002A14F28>
为什么会发生这种情况,我该如何解决这个问题?
非常感谢
reversed
返回一个迭代器,它将以相反的顺序迭代列表。它不会返回反向列表。这是一个重要的区别,因为如果返回的是反向列表,则必须在内存中分配该列表。因此,您最终会得到一份副本。并且您将必须对其进行两次迭代(一次用于创建反向列表,然后一次用于打印)。
相反,它reversed
只是在原始列表的末尾开始迭代。如果在创建reversed
迭代器后修改列表,则可以轻松地看到以下内容:
>>> a = [1,2,3,4,5]
>>> r = reversed(a)
>>> a[2:2] = [10, 11, 12, 13]
>>> a
[1, 2, 10, 11, 12, 13, 3, 4, 5]
>>> list(r)
[12, 11, 10, 2, 1]
颠倒的迭代器只是想起指数在那里将开始迭代(即指数4
)。使用修改后的列表,该列表不再是列表的末尾。
因此,如果要以相反的顺序复制列表,则必须对其进行调用list
以从中创建一个列表。否则,如果可以的话,您实际上应该只尝试在迭代reversed
器上进行迭代。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句