浅拷贝()方法没有按预期工作?

shallow copy() method not working as expected?

当使用 copy() 时,它会创建一个全新的数据,对 kvps 的更改 不会影响 theCopy 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() 之后 - 这是否意味着复制 'follows' 对 kvps 所做的任何更改? 但这也叫参考?我对 copy() 和 reference 这两个术语感到困惑..

copy 是一个浅拷贝,它仍然持有对其原始来源的引用。如果你想 复制在一起是一个不同的对象,那么你需要导入复制模块 并使用深度复制方法

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)

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

>>> 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