今天做隐写算法研究的时候出现了一个问题,简单的描述就是:在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]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)