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 に答える