我正在尝试以下列方式使用reverse()方法:
>>> L=[1,2,3]
>>> R=L
>>> L.reverse()
>>> L
[3, 2, 1]
>>> R
[3, 2, 1]
为什么它也反转R? 如何保留原始列表并创建反转?
谢谢!
答案 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]