正如你可以通过标题猜测我不太确定如何提出这个问题。无论如何,问题如下:
我想将一个numpy数组作为参数传递给一个函数,在这个函数中我想制作一个该数组的副本,然后将数组传递给另一个操作数组的函数,最后用副本替换数组。
...
arr = np.array([...])
arr_ocp = arr.copy()
func1(arr)
print np.array_equal(arr,arr_ocp) -> False
...
def func1(arr):
arr_cp = arr.copy()
func2(arr)
print np.array_equal(arr,arr_cp) -> False
arr = arr_cp
print np.array_equal(arr,arr_cp) -> True
def func2(arr):
...
arr[x:x+l,y:y+w] += np.array(...)
...
现在我做了一些打印,事实证明func1 arr在开始和结束时是相同的,这是我所期待的。但是如果我在func1(arr)之后进行打印,arr现在是func2之后的arr值。那么为什么func2的操作适用于arr而不适用于arr = arr_cp
?
事后看来,最好将副本传递给func2而不是数组本身,但我不希望这种情况发生。我在这里错过了什么吗?
答案 0 :(得分:4)
您需要了解变异和重新绑定之间的区别。当您执行arr = arr_cp
时,您所做的只是将名称arr
重新绑定到arr_cp
引用的任何内容。您不会以任何方式影响先前绑定到arr
的对象。
但是,当你对arr
本身做任何事情 - 例如,arr[0] = 'foo'
- 这是一个变异,并改变了实际的对象。绑定到同一个对象的所有名称将继续这样做,因此所有更改都将显示。