以下の簡単なプログラムに問題があります:
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配列を変更していないので、それが出力されます。
いくつかの概念を明確にするために、この回答を読むことをお勧めします。