【python】浅拷贝和深度拷贝的区别

【python】浅拷贝和深度拷贝的区别,第1张

【python】浅拷贝和深度拷贝的区别

今天做隐写算法研究的时候出现了一个问题,简单的描述就是:在python中,把original_coeff_list[]和stego_coeff_list[]直接以等号赋值的形式联系起来了,隐写完成之后,需要对stego_coeff_list[]覆盖时,同步地也会对original_coeff_list[]覆盖

original_coeff_list = []
stego_coeff_list = original_coeff_list
for i in range(len(stego)):
	stego_coeff_list[i] = stego[i]
	
# 此时,修改掉的stego_coeff_list[i]也同步地在original_coeff_list[i]中更新了!

用另外一个例子来说明就是:以直接赋值的方式(直接等号)对arr2赋值时,若更改arr2的某个值,会同步地更新arr1中的值。然而,我们希望的效果是只改表arr2[0],而不改变arr1[0]。

import numpy as np
import copy

array1 = np.array([0, 1, 2, 3, 4, 5])
array2 = array1
# array2 = copy.deepcopy(array1)

array2[0] = 1

print("array1 = ", array1) # array1 =  [1 1 2 3 4 5]
print("array2 = ", array2) # array2 =  [1 1 2 3 4 5]

究其原因是因为python的底层逻辑和C/C++不相同,python用等号直接赋值的时候,是对对象的引用,实际上是把地址也传递过去了,所以对arr2修改的时候,也会对arr1修改(因为同步更新的是地址嘛)。

所以,这时候就需要用到python中的copy.deepcopy深度拷贝功能了,直接放链接:Python 直接赋值、浅拷贝和深度拷贝解析

python的深拷贝可以理解成又重新创建了一个对象,两个数组是相互独立的,所以arr2的更新不会对arr1造成影响。所以,只用一个copy.deepcopy()就可以完美解决实验碰到的这个问题啦!

import numpy as np
import copy

array1 = np.array([0, 1, 2, 3, 4, 5])
# array2 = array1
array2 = copy.deepcopy(array1)

array2[0] = 1

print("array1 = ", array1) # array1 =  [0 1 2 3 4 5]
print("array2 = ", array2) # array2 =  [1 1 2 3 4 5]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存