2017-12-21 7 views
1

간단한 코드가 이와 같이 작동하는 이유를 이해하는 데 어려움을 겪고 있습니다. 인수로 배열을 취하는 2 개의 인스턴스 a와 b를 만듭니다. 그런 다음 인스턴스 배열 중 하나를 변경하는 메서드를 정의하지만 둘 다 변경됩니다. 왜 이런 일이 벌어 지는지 그리고 어떻게 다른 인스턴스를 변경하는 방법을 피할 수 있습니까?두 인스턴스 중 하나만 적용한 경우에도 메서드가 두 인스턴스를 변경합니다.

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

관련 문제