如何在不修改Python中的原始列表的情况下反转列表

时间:2017-01-21 08:41:22

标签: python python-3.x

我正在尝试以下列方式使用reverse()方法:

>>> L=[1,2,3]
>>> R=L
>>> L.reverse()
>>> L
[3, 2, 1]
>>> R
[3, 2, 1]

为什么它也反转R? 如何保留原始列表并创建反转?

谢谢!

6 个答案:

答案 0 :(得分:1)

您需要复制一份清单

L=[1,2,3]
# R=L
R = L[:]
L.reverse()

或更直接(使用切片表示法反转):

R = L[::-1]

如果你只是写R = L,那么R只是同一列表L上的新参考。

如果您还需要复制列表中的元素,请使用copy.deepcopy; R = L[:]只生成一个浅拷贝(在你的情况下,在列表中只有int的情况下这很好。)

答案 1 :(得分:1)

要避免撤消R,您需要L

的副本

要制作副本,请更改

R=L    <---- this is not copying L in to R

R= L[:]    <---- this will create a copy of L in to R

答案 2 :(得分:0)

这样做

R = L[:]

了解复制和深度复制,以了解发生这种情况的原因。简而言之,这是因为当你R = L时,两者都指向&#34;相同&#34;在内存中列出所以反转一个将反转另一个。

或者,您可以使用deepcopy

答案 3 :(得分:0)

操作

R=L

表示变量R存储L正在存储的任何内容,即R引用L所引用的任何值。现在,当你反转L时,这意味着L所引用的列表是反转的。由于R也引用相同的地址,你会看到R反转。

答案 4 :(得分:0)

你被Python分配引用而不是副本这一事实所困扰。

Python专门使用引用以防止不需要的副本。它在传递函数参数时也使用引用,甚至使用默认函数参数。它只会在你明确告诉它时制作副本,例如通过做

L = list(R)

from copy import copy
L = copy(R)

两者之间的区别在于list(R)总是返回一个列表,其中copy返回与原始对象类型相同的对象。此外,copy不适用于迭代器,但list可以使用。

请注意,这些是“浅”的。副本。如果列表包含对象,则新列表包含对相同对象的引用。对于&#39; deep&#39;副本,它在模块deepcopy中具有函数copy

from copy import deepcopy
L = deepcopy(R)

但实际上很少需要制作明确的副本。 Python提供了例如可用于迭代列表的reversed内置函数。

for l in reversed(L):
    # do stuff

它返回一个迭代器,因此效率很高。无需复制列表。可能需要复制的其他情况可以通过例如处理。发电机功能。复制的有效案例可能是在通过线程边界设置数据时。

答案 5 :(得分:0)

>>> L=[1,2,3]
>>> R=list(reversed(L))
>>> R
[3, 2, 1]
>>> L
[1, 2, 3]