只是想知道在引用方面,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
只是想知道在引用方面,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
reverse
是就地逆转列表,详见Python官方文档。而 [::-1]
返回按照相反顺序排序的新列表。
调用 p.reverse()
后,尝试使用 print(p)
,你会看到区别。
reversed(seq)
,它将返回一个反向的iterator
,该对象表示将返回该流的连续项的数据流。生成这个反向迭代器的时间/空间复杂度为O(1)
,并且使用它来迭代列表的元素将是O(N)
,时间/空间复杂度为O(1)
,其中N是列表的长度。如果只想迭代反转后的列表而不修改它,则应采用此方法。在这种情况下,此方法具有最佳性能。p.reverse()
原地翻转列表。该操作的时间/空间复杂度为O(N)
,O(1)
,因为它将不得不遍历列表的一半来反转它们,并且它不会将结果存储在新列表中。
p.reverse()
将返回None
,并且在此指令之后,元素将直接在p
中反转。如果您不需要保留原始列表并且必须对反转列表的元素进行多次通过/操作并保存处理过的反转列表,则可以选择此方法。[::-1]
创建列表/复制品的一个新对象。该操作的时间/空间复杂度为O(N)
,O(N)
,因为必须将列表的所有元素复制到新列表中,并且这个新列表还将消耗与原列表相同的空间。在引用方面,您将创建一个新对象,因此即使print(p == x)
返回True
,但是print(p is x)
将返回False
,因为即使它们共享相同的值,两个对象也具有不同的引用。如果需要保留原始列表并在不同的对象中存储反向副本以进行进一步处理,则可以选择此方法。
reverse()
方法原地反转列表,[::-1]
则克隆一个翻转顺序的列表。 - Jeff Mercadoreversed
可能更有效率。例如for value in reversed(p)
不会增加太多开销(与任何其他迭代相比)。p[::-1]
和p.reverse()
都是O(N)
,但是reversed(p)
是O(1)
。当然,对其进行迭代也是O(N)
,但是在不进行反转的情况下,对p
进行迭代也是O(N)
。 - Blckknght