반응형

 


파이썬에서 변수들은 해당 객체의 주소를 가지고 있습니다.
예를 들어 a=1이라고 하면 a가 1이라는 값을 가지는 것이 아니라 1이라는 객체가 생성되고 이 객체의 주소가 변수에 저장되는 것입니다.

객체의 고유한 id 값을 반환하는 id() 함수를 사용해서 확인해 보겠습니다.

리스트로 만든 a는 리스트가 있는 주소를 기억 하고 b 역시 이 주소를 복사하기 때문에 리스트 안의 내용을 수정하면 b를 호출해도 수정된 내용이 표시됩니다. 새로운 객체를 생성한 것이 아니라 객체 내의 a[0] 내용만 바꿨으므로 객체의 id역시 처음과 똑같이 유지 되는군요.

한마디로 말하자면 a와 b는 같은 객체를 공유하고있는 것입니다.



하지만 integer형으로 a와 b를 만들었을 때는 조금 다른 결과가 나오네요. a에 다른 값을 넣으니 a의 id가 바뀐 것을 확인할 수 있습니다. 아마도 이런 타입에서는 변수의 값이 바뀌면 새로운 id로 객체가 생성되나 봅니다. 정확한 속 사정을 아시는 분은 코멘트 좀 부탁드려요~~!




혹시나 해서 자바에서도 제 나름 비슷하게 따라 해봤는데 유사한 결과가 나오네요.






리스트의 경우에 a와 b가 같은 객체를 공유하지 않게하려면 아래와 같이 [:]을 써서 복사하면 됩니다.
복사 후에 id를 확인해 보면 서로 다른 id를 가진 것을 확인할 수 있습니다. a[0]만 수정했을 때 당연히 a와 b를 호출하면 서로 다른 값이 나옵니다.





리스트 이외의 경우는 copy 모듈을 사용합니다. copy 모듈의 copy()함수는 주소가 복사되는 얕은 복사(shallow copy)를 하며, deepcopy()함수는 객체를 공유하지 않는 깊은 복사(deep copy)를 합니다.



다시 한번 자세히 비교해 보면 다음과 같습니다.
마지막 줄에 리스트 각각의 id는 다르지만 그 리스트의 1번 인덱스의 id를 비교해 보면 a[1]와 cp[1]은 같은 id를 가지고 있는 것을 확인 할 수 있습니다. 분명히 copy()가 얕은 복사라고 했는데 a와 cp의 id가 서로 다르게 나와서 처음에 많이 헷갈렸습니다.


프로그래밍할 때 얕은 복사와 깊은 복사에 유의해서 사용해야겠네요^^

 


반응형

+ Recent posts