今天写代码做一些数组运算,发现了如下问题:将数组 2 赋给数组 1 后,修改数组 2,结果数组 1也跟着被修改了,示意代码如下:
import numpy as np
arr1 = np.array([1, 3, 5])
arr2 = arr1
arr2[1] = 999
print(arr1, arr2)
运行结果:
[ 1 999 5] [ 1 999 5]
查找相关资料后发现原来是因为在Python中,形如arr1 = arr2
的赋值操作不会创建 arr1 的副本,而是让 arr2 和 arr1 指向同一个数组对象。因此,对 arr2 的任何修改也会影响 arr1,因为它们引用的是同一个数组。
解决方法:使用numpy.copy
实现 arr1 的副本创建:
import numpy as np
arr1 = np.array([1, 3, 5])
arr2 = np.copy(arr1)
arr2[1] = 999
print(arr1, arr2)
运行结果:
[1 3 5] [ 1 999 5]
可见,此时可以独立的修改 arr2。
此外,经过测试发现,Fortran中是可以通过arr1 = arr2
来创建 arr1 副本的:
program test
implicit none
integer :: arr1(3), arr2(3)
arr1 = [1, 2, 3]
arr2 = arr1
arr2(2) = 999
print '(3(I4, " "))', arr1
print '(3(I4, " "))', arr2
end program test
编译运行,结果如下:
1 2 3
1 999 3