浅表copy()方法无法按预期工作?

时间:2018-11-12 22:49:03

标签: python copy shallow-copy

使用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()和引用感到困惑。

2 个答案:

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