shallow copy()方法未按预期工作?

2024-06-16 19:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

使用copy()时,它会创建一个全新的数据,对kvps的更改不会影响copy var

aList = [1,2]
bList = [3,4]

kvps = { '1' : aList, '2' : bList }
theCopy = kvps.copy() # this creates totally new copy, not a reference?

kvps['1'][0] = 5 #this var kvps becomes { '1' : [5,2], '2' : [3,4] }?

sum = kvps['1'][0] + theCopy['1'][0] #must be 5+1 = 6
print(sum)

但正确答案是10?为什么

在kvps.copy()之后-这是否意味着拷贝“遵循”对kvps所做的任何更改但这称为参考?我对copy()和reference的术语感到困惑


Tags: 数据newvarnotthisreferencesumcopy
2条回答

拷贝是一个浅拷贝,它仍然保留对其原始源的引用。如果你愿意的话 复制到一个不同的对象一起,然后您需要导入复制模块 使用deepcopy方法

import copy

aList = [1,2]
bList = [3,4]

kvps = { '1' : aList, '2' : bList }

theCopy = copy.deepcopy(kvps) # this creates totally new copy, not a reference? yes

kvps['1'][0] = 5 #this var kvps becomes { '1' : [5,2], '2' : [3,4] }? yes

sum = kvps['1'][0] + theCopy['1'][0] #must be 5+1 = 6
print(sum)

您正在创建dict的浅表副本,这实际上意味着您可以(重新)独立地分配两个dict中的键,因为原始dict和副本在内存中不引用同一对象。但是,不会复制这些值

>>> kvps
>>> {'1': [1, 2], '2': [3, 4]}
>>> copy = kvps.copy()
>>> copy['5'] = [5, 6]
>>> kvps
>>> {'1': [1, 2], '2': [3, 4]}
>>> copy
>>> {'1': [1, 2], '2': [3, 4], '5': [5, 6]}

如果要对这些值进行深度复制,请使用copy.deepcopy

>>> from copy import deepcopy
>>> the_deepcopy = deepcopy(kvps)
>>> kvps['1'][0] = 5
>>> kvps['1'][0]
>>> 5
>>> copy['1'][0]
>>> 5
>>> the_deepcopy['1'][0]
>>> 1

相关问题 更多 >