在Python中复制

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

有人可以解释为什么会发生这种情况吗?

>>> A = [1,[2,3],4] 
>>> B = A[:]
>>> B[0] = 'x'
>>> B
['x',[2,3],4]
>>>A
[1,[2,3],4]
>>> B[1][0] = 'y'
>>> B
['x',['y',3],4]
>>> A
[1,['y',3],4]

最后当我们要求返回 A 时,我们应该得到 [1,[2,3],4] 作为答案,对吧?因为我们为 B 创建了单独的副本。

python-3.x object copy deep-copy shallow-copy
2个回答
1
投票

列表是Python中默认的引用。当您分配

B = A[:]
时,您正在尝试创建 A 的副本。它按照您对正常值的预期工作。但 A 的第二个元素又是另一个 List(即 [2,3]),而后者又是另一个引用。

换句话说,这样想

B = A[:]
就像是说

B = []
B[0]=A[0] # here A[0] = 1
B[1]=A[1] # here A[1] is a reference to [2,3]
......

因此实际上 B 和 A 的第二个元素都是对同一个 List 的引用。


0
投票

您可以使用:

https://pypi.org/project/memory-graph

绘制数据图表并轻松理解问题:A 和 B 共享数据。

import memory_graph # see install instructions at link above

A = [1,[2,3],4] 
B = A[:]
B[0] = 'x'
print(B)
print(A)
B[1][0] = 'y'
print(B)
print(A)

memory_graph.d() # draw graph

您可能想要制作深复制而不是浅复制:

import memory_graph
import copy

A = [1,[2,3],4] 
B = copy.deepcopy(A) # <------ deep copy
B[0] = 'x'
print(B)
print(A)
B[1][0] = 'y'
print(B)
print(A)

memory_graph.d()

请参阅上面的链接,了解浅复制和深复制之间差异的说明。

完全披露:我是memory_graph的开发者。

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