2017-12-21 14 views
1

私の単純なコードがこのように動作する理由を理解するのは苦労しています。私は引数として配列をとる2つのインスタンスaとbを作成します。次にインスタンス配列の1つを変更するメソッドを定義しますが、両方とも変更されます。なぜこのようなことが起こるのか、どうすれば他のインスタンスを変更する方法を避けることができますか?メソッドはどちらか一方にしか適用されない場合でも両方のインスタンスを変更します

import numpy as np 
class Test: 
    def __init__(self, arg): 
    self.arg=arg 


    def change(self,i,j,new): 
    self.arg[i][j]=new 




array=np.array([[11,12,13]]) 
a=Test(array) 
b=Test(array) 
#prints the same as expected 
print(a.arg) 
print(b.arg) 
print() 
a.change(0,0,3) 
#still prints the same, even though I did 
#not change b.arg 
print(a.arg) 
print(b.arg) 
+0

あなたは両方のコンストラクタに同じ配列*を渡しました...なぜそれが変わるとは思わなかったのですか? –

答えて

2

インスタンスメンバーと同じオブジェクトを割り当てたためです。 (コメントでroganjoshで述べたように)あなたが__init__方法でそれを行うことができ、あなたのargは常にnp.arrayであれば、代わりに

array = np.array([[11,12,13]]) 
a = Test(array.copy()) 
b = Test(np.array(array, copy=True)) 

:あなたは、新しい配列オブジェクトを生成するnp.array(x, copy=True)またはx.copy()を使用することができます

class Test: 
    def __init__(self, arg): 
     self.arg = np.array(arg, copy=True) 
    ... 
+0

私は、簡単な解決策は、 'init'でコピーを作成することだと思います。したがって、 'self.arg = arg.copy()' – roganjosh

+0

@roganjosh一般的には同意しますが、OPが示したクラスは一般的に 'arg'が常に' np.array'であるとは限りません。 – Graipher

+1

それは公正な点です。私は、構文を減らすために 'a = Test(array.copy())'の中間になると思います。 – roganjosh

関連する問題