reverse()在Python字面量上不起作用?

18 投票
5 回答
2509 浏览
提问于 2025-04-16 22:16

为什么这个在Python中不管用呢?

>>> print [0,1,0,1,1,0,1,1,1,0,1,1,1,1,0].reverse() 
None

我本来想得到一个反向的列表。

5 个回答

22

如果你想要一个列表的反向副本,可以使用 reversed

>>> list(reversed([1,2,3,4]))
[4, 3, 2, 1]

另外,reversed 返回的是一个迭代器,而不是像 [][::1] 那样的列表副本。所以当你需要遍历一个反向的可迭代对象时,使用它会更合适。这里的 list() 只是用来演示的。

52
>>> a = [3, 4, 5]
>>> print a.reverse()
None
>>> a
[5, 4, 3]
>>>

这是因为 reverse() 这个方法并不会返回一个新的列表,而是直接在原来的列表上进行反转。所以当你调用 a.reverse() 时,它的返回值是 None,这就是为什么在 print 中看到的是 None

23

如果你想要返回一个新的列表,并且这个列表是反向的,你可以使用 [::-1]

>>> [0,1,0,1,1,0,1,1,1,0,1,1,1,1,0][::-1]
[0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0]

我还在搞明白为什么会有人给这个投反对票,如果你不在乎原来的列表被改变,可以使用 @taskinoor的回答,这样会更快。

不过,如果你需要保持原来的列表不变,我建议你使用 [::-1]

from time import time
lst = [0,1,0,1,1,0,1,1,1,0,1,1,1,1,0]

s = time()
for i in xrange(5000000):
    a = lst[::-1]          # creates a reversed list
print time() -s

s = time()
for i in xrange(5000000):
    b = lst[:]             # copies the list
    b.reverse()            # reverses it
print time() -s

输出结果

2.44950699806
3.02573299408

撰写回答