今天做隐写算法研究的时候出现了一个问题,简单的描述就是:在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]
用另外一个例子来说明就是:以直接赋值的方式(直接等号)对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[0] = 1
print("array1 = ", array1)
print("array2 = ", array2)
究其原因是因为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 = copy.deepcopy(array1)
array2[0] = 1
print("array1 = ", array1)
print("array2 = ", array2)
|