본문 바로가기
프로그래밍/Python 관련 정보

[Python Programming 기초] Container

by 물박사의 저장공간 2024. 10. 19.

Container는 list, dictionary, set 등 데이터를 담고 있는 iterable object의 일종입니다. 

다만, 여기서 주의하셔야 할 점은 데이터를 담고 있다고 해서 실제로 값을 저장해놓고 있는 것이 아니라 데이터의 id, 다시 말해 (메모리)주소를 저장해두고 있는 object라고 보시면 될 것 같습니다. 

예를 들어, 아래 보시는 것처럼 크기가 4인 list A가 있고, A의 첫번째 slot에 다시 [1, 2, 3]이라는 list가 원소로 들어있다고 해보겠습니다. list A의 첫번째 slot은 [1, 2, 3]의 id를 가리키고 있습니다. 다시 [1, 2, 3]리스트의 각 slot은 1, 2, 3이라는 각각의 데이터에 대응되는 id를 가리키고 있는 것입니다. 

container가 이런식으로 작동하기 때문에 mutable 객체를 binding 시켰을 경우에 문제가 발생할 수 있습니다.  "multi-binding"인데요. 우리 mutable/immutable의 개념을 다시 살펴볼까요?

https://trillionver2.tistory.com/entry/Python-Programming-%EA%B8%B0%EC%B4%88-MutableImmutable

 

[Python Programming 기초] Mutable/Immutable

파이썬의 변수 타입은 불변형(immutable) 객체와, 가변형(mutable) 객체가 있습니다. 이 타입에 따라 값의 수정이 허용(mutable)되기도 하고 허용되지 않기(immutable)도 하는데요.  immutable 객체의 대표적

trillionver2.tistory.com

위의 예시와 같이 List_1=[1, 2, 3]으로 정의하고 List_2를 List_1을 가리키도록 선언했습니다. 반면에 List_3은 List_1처럼 직접 [1, 2, 3]으로 정의해줬습니다. 이제 List_1의첫번째 원소를 -1로 변경한다면.. List_1뿐만 아니라 그것을 가리키도록 선언된 List_2까지 덩달아 영향을 받습니다. 

 

비슷하게

x = [[1]]*2 와 같은 식으로 list를 만들고 x[0][0]=5 로 바꾸면 x [[5], [5]] 가 되어 버립니다.

 

그렇다면 만약 이런 multi-binding 문제를 우회하고자 하는 경우에는 어떻게 하면 될까요? 

deepcopy()를 쓰면 됩니다. 이렇게 되면 id뿐만아니라 그 대상까지 같이 복사하게 됩니다.