反转和[ ::-1 ]之间的区别

19

只是想知道在引用方面,reverse()和 [::-1] 之间的区别。

例如

p = [1,2,3] 
x = p[::-1] 
print(x) 
print(p) 

p.reverse() 
print(p ==p[::-1]) 
print(p == x) 

因此,输出结果为

[3,2,1]
[1,2,3] 
False
True 

4
reverse()方法原地反转列表,[::-1]则克隆一个翻转顺序的列表。 - Jeff Mercado
2
你的输出难道不展示了它们之间的差异吗? - Dan Getz
6
请注意,如果您实际上不需要一个按照相反顺序排列值的列表(只是一个可迭代对象),那么使用内置函数reversed可能更有效率。例如 for value in reversed(p) 不会增加太多开销(与任何其他迭代相比)。 p[::-1]p.reverse() 都是 O(N),但是 reversed(p)O(1)。当然,对其进行迭代也是 O(N),但是在不进行反转的情况下,对 p 进行迭代也是 O(N) - Blckknght
2个回答

23

reverse 是就地逆转列表,详见Python官方文档。而 [::-1] 返回按照相反顺序排序的新列表。

调用 p.reverse() 后,尝试使用 print(p),你会看到区别。


1
@M.Jones 如果您觉得这个答案有帮助解决了您的问题,请点击绿色勾号将其标记为“接受”。这将有助于社区集中关注未解决的问题。 - Lahiru Jayaratne

4
关于Python中反转列表的三种主要方法:
1. 使用内置函数reversed(seq),它将返回一个反向的iterator,该对象表示将返回该流的连续项的数据流。生成这个反向迭代器的时间/空间复杂度为O(1),并且使用它来迭代列表的元素将是O(N),时间/空间复杂度为O(1),其中N是列表的长度。如果只想迭代反转后的列表而不修改它,则应采用此方法。在这种情况下,此方法具有最佳性能。
2. p.reverse()原地翻转列表。该操作的时间/空间复杂度为O(N)O(1),因为它将不得不遍历列表的一半来反转它们,并且它不会将结果存储在新列表中。 p.reverse()将返回None,并且在此指令之后,元素将直接在p中反转。如果您不需要保留原始列表并且必须对反转列表的元素进行多次通过/操作并保存处理过的反转列表,则可以选择此方法。
3. 使用切片[::-1]创建列表/复制品的一个新对象。该操作的时间/空间复杂度为O(N)O(N),因为必须将列表的所有元素复制到新列表中,并且这个新列表还将消耗与原列表相同的空间。在引用方面,您将创建一个新对象,因此即使print(p == x) 返回True,但是print(p is x)将返回False,因为即使它们共享相同的值,两个对象也具有不同的引用。如果需要保留原始列表并在不同的对象中存储反向副本以进行进一步处理,则可以选择此方法。
总之,根据您的使用情况,您将必须使用其中一种具有略微不同目标和完全不同性能的3种方法之一。

点赞为添加用例背景,非常有帮助! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接