我对下面的简单程序有疑问:
def my_function(my_array = np.zeros(0)):
my_array = [1, 2, 3]
my_array = np.zeros(0)
my_function(my_array)
print my_array
它打印一个空数组,就好像my_array
通过复制而不是通过函数内部的引用传递一样。如何纠正?
我对下面的简单程序有疑问:
def my_function(my_array = np.zeros(0)):
my_array = [1, 2, 3]
my_array = np.zeros(0)
my_function(my_array)
print my_array
它打印一个空数组,就好像my_array
通过复制而不是通过函数内部的引用传递一样。如何纠正?
引用传递模型更像是指针的值传递。因此,在您的 my_function 中,您有一个指向原始 my_array 的指针的副本。如果您要使用该指针直接操作输入的数组,则会进行更改,但复制指针的重新分配不会影响原始数组。
举个例子:
def my_func(a):
a[1] = 2.0
ar = np.zeros(4)
my_func(ar)
print ar
上面的代码会改变 ar 的内部值。
您可以在这里使用切片分配,就像使用列表一样:
def func(my_array):
my_array[:3] = [1,2,3]
请注意,这仍然需要其中my_array
至少有 3 个元素......示例用法:
>>> def func(my_array):
... my_array[:3] = [1,2,3]
...
>>> a = np.zeros(4)
>>> a
array([ 0., 0., 0., 0.])
>>> func(a)
>>> a
array([ 1., 2., 3., 0.])
您缺少的是 python 如何处理引用。当您输入时my_function
,您将引用绑定到名称的原始 ndarray 对象my_array
。但是,一旦您为该名称分配了新内容,您就会丢失原始引用并将其替换为对新对象(在本例中为列表)的引用。
请注意,具有可变对象的默认参数通常会导致意外
np.zeros(0)
给你一个空的numpy数组。您的函数中的引用现在指向一个新的 Python 列表,但您实际上并没有修改您的空 numpy 数组,所以这仍然是您要打印的内容。
建议阅读此答案以清除一些概念。