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뿐만아니라 그 대상까지 같이 복사하게 됩니다.
'프로그래밍 > Python 관련 정보' 카테고리의 다른 글
[Python Programming 기초] Comprehension (2) | 2024.10.22 |
---|---|
[Python Programming 기초] Iterator (1) | 2024.10.20 |
[Python Programming 기초] Mutable/Immutable (1) | 2024.10.19 |
[Python Programming 기초] 파이썬 연산자 우선순위 (4) | 2024.10.17 |
Iterator/Generator의 활용 (5) | 2022.05.18 |