以相反顺序打印列表不起作用 - Python 3x

Tur*_*rbo 2 python list

我正在编写一个程序,不断要求用户输入名称,直到输入单词 END 为止,此时它会以相反的顺序打印出名称列表。

起初,我不知道如何以相反的顺序打印出列表,所以我发现了这个:Travers a list inverse order in 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)
Run Code Online (Sandbox Code Playgroud)

然而,它打印的只是:

<list_reverseiterator object at 0x0000000002A14F28>
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我该如何解决这个问题?

非常感谢

pok*_*oke 5

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]
Run Code Online (Sandbox Code Playgroud)

反向迭代器只记住了它将开始迭代的索引4(即索引)。对于修改后的列表,这不再是列表的结尾。

因此,如果您想要以相反的顺序复制列表,则必须调用list它并从中创建一个列表。否则,如果可以的话,您真的应该尝试迭代迭代reversed器。