使用copy()时,它会创建一个全新的数据,对kvps的更改不会影响 Copy变量吗?
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()之后-是否意味着Copy“跟随”对kvps所做的任何更改? 但这被称为参考吗?我对术语copy()和引用感到困惑。
答案 0 :(得分:1)
copy是一个浅表副本,它仍然保留对其原始来源的引用。如果你想 副本一起成为不同的对象,那么您需要导入副本模块 并使用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)
答案 1 :(得分:1)
您正在创建字典的浅表副本,这实际上意味着您可以独立地(重新)分配两个字典中的键,因为原始字典和副本不会在内存中引用相同的对象。但是,这些值不会被复制。
>>> 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