5

我对下面的简单程序有疑问:

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通过复制而不是通过函数内部的引用传递一样。如何纠正?

4

3 回答 3

17

引用传递模型更像是指针的值传递。因此,在您的 my_function 中,您有一个指向原始 my_array 的指针的副本。如果您要使用该指针直接操作输入的数组,则会进行更改,但复制指针的重新分配不会影响原始数组。

举个例子:

def my_func(a):
    a[1] = 2.0

ar = np.zeros(4)
my_func(ar)
print ar

上面的代码会改变 ar 的内部值。

于 2013-03-04T15:30:27.057 回答
8

您可以在这里使用切片分配,就像使用列表一样:

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。但是,一旦您为该名称分配了新内容,您就会丢失原始引用并将其替换为对新对象(在本例中为列表)的引用。

请注意,具有可变对象的默认参数通常会导致意外

于 2013-03-04T15:24:51.800 回答
6

np.zeros(0)给你一个空的numpy数组。您的函数中的引用现在指向一个新的 Python 列表,但您实际上并没有修改您的空 numpy 数组,所以这仍然是您要打印的内容。

建议阅读此答案以清除一些概念。

于 2013-03-04T15:26:07.690 回答