python:改变列表的副本会改变原始列表?

问题描述 投票:0回答:1

所以直到现在,我都假设如果你有,例如:

L1 = [1,2,3]
L2 = L1
L2.append(5)

L 和 L2 都会受到附加代码的影响。

但是,当您将 L2 指定为列表的副本时,例如:

L = [1,2,3]
L2 = L[:]
L2.append(5)

只有L2会受到影响,L仍然指[1,2,3]

但我现在遇到了这个:

x = [1, 2]
L1 = [x, [8, 9]]
L2 = L1[:]
L2[0][1] = 999

>>>print(L1)
[[1,999],[8,9]]
>>>print(L2)
[[1,999],[8,9]]

为什么在这种情况下,两个列表都改变了?

python list
1个回答
5
投票

切片是浅拷贝。通过切片创建的副本将包含对原始列表旧元素的新引用;如果原始列表包含可变对象(例如更多列表),则副本将包含对这些相同列表的引用。您可以使用

copy.deepcopy
尝试解决此问题,或者循环原始列表并将元素切片复制到新列表中。不过,要小心
copy.deepcopy
;通常,在达到一定深度时您会想要停止制作副本并保留原始元素。

© www.soinside.com 2019 - 2024. All rights reserved.