只是想知道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
olqngx591#
reverse**在原处 * a反转列表,参见the manual,而[::-1]以相反的顺序给出新列表。在调用p.reverse()之后尝试print(p),您将看到不同之处。
reverse
[::-1]
p.reverse()
print(p)
2hh7jdfx2#
关于python中的倒排表,主要有3种方法:
iterator
reversed(seq)
O(1)
O(N)
None
p
print(p == x)
True
print(p is x)
False
总而言之,根据您的用例,您将不得不使用这三种目标略有不同、性能完全不同的方法之一。
2条答案
按热度按时间olqngx591#
reverse
**在原处 * a反转列表,参见the manual,而[::-1]
以相反的顺序给出新列表。在调用
p.reverse()
之后尝试print(p)
,您将看到不同之处。2hh7jdfx2#
关于python中的倒排表,主要有3种方法:
iterator
的内置函数reversed(seq)
,反向iterator
是表示将返回该流的连续项的数据流的对象。生成该反向迭代器在时间/空间复杂度上是O(1)
,并且使用它来迭代通过列表的元素将是O(N)
,O(1)
的时间/空间复杂度,其中N是列表的长度。如果您只是想在不修改的情况下迭代反向列表,则需要使用这种方法。在这种情况下,这种方法可以提供最佳性能。p.reverse()
就地反转列表。操作是O(N)
,O(1)
在时间/空间复杂性方面是低的,因为它必须遍历列表的一半元素来反转它们,并且它不将结果存储在新列表中。p.reverse()
将返回None
,并且在该指令之后,元素将在p
中直接反转。如果您不不需要保留原始列表,并且您有几个通道/操作要对反转列表的元素执行,以及如果您必须保存处理过的反转列表,则此方法很好。[::-1]
创建列表的新对象/a以逆序复制。该操作在空间/时间复杂度上是O(N)
,O(N)
,因为您必须将列表的所有元素复制到新列表中,并且此新列表也将消耗与原始列表相同的空间量。在引用方面,您将创建一个新对象以便即使print(p == x)
返回True
,print(p is x)
将返回False
,因为这两个对象共享相同的值,但具有不同的引用。如果您需要保留原始列表,并将其反向副本存储在不同的对象中以供进一步处理,那么这种方法非常有用。总而言之,根据您的用例,您将不得不使用这三种目标略有不同、性能完全不同的方法之一。