【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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值