当作为参数传递给函数时,numpy数组如何改变

时间:2016-04-06 12:37:08

标签: python python-2.7 numpy

正如你可以通过标题猜测我不太确定如何提出这个问题。无论如何,问题如下:

我想将一个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而不是数组本身,但我不希望这种情况发生。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:4)

您需要了解变异和重新绑定之间的区别。当您执行arr = arr_cp时,您所做的只是将名称arr重新绑定到arr_cp引用的任何内容。您不会以任何方式影响先前绑定到arr的对象。

但是,当你对arr本身做任何事情 - 例如,arr[0] = 'foo' - 这是一个变异,并改变了实际的对象。绑定到同一个对象的所有名称将继续这样做,因此所有更改都将显示。