파이썬을 하다보면, 정말 이거 진짜 헷갈릴수도 있습니다. 저도 처음에 너무 당황 했었는데
파이썬에는 깊은 복사 와 얕은 복사가 있습니다.
Shallow Copy 예제
import copy
p1 = [['hi','hwy'],(123,467),'hi there'] 가 있을때
p2 = copy.copy(p1)
del p2[2]
---------------------------------------
output:
p1 = [['hi', 'hwy'], (123, 467), 'hi there']
p2 = [['hi', 'hwy'], (123, 467)]
=======================================
p1 = [['hi','hwy'],(123,467),'hi there']
p2 = copy.copy(p1)
del p2[0][0]
---------------------------------------
output:
[['hwy'], (123, 467), 'hi there']
[['hwy'], (123, 467), 'hi there']
이렇게 보면 아.. 카피한건가 ? 싶습니다. 그런데.. 여기서 shallow copy는 재밌는게 각 요소 p1[0] 이 요소들은 복사를 한것이 아닙니다. 말그대로 참조한 것입니다.
아니 이게 무슨소리냐 p1, p2는 서로 다른 리스트 입니다. 그렇지만 각 요소의 주소 맴버들은 같은 주소를 가르키고 있습니다.
Deep Copy 예제
p1 = [['hi','hwy'],(123,467),'hi there']
p2 = copy.deepcopy(p1)
del p2[0][0]
---------------------------------------
output:
[['hi', 'hwy'], (123, 467), 'hi there']
[['hwy'], (123, 467), 'hi there']
객체의 주소 및 리스트의 맴버 변수들의 주소 모두 다릅니다.
서로 영향을 안받으려고 할 때, 사용하는 방법입니다.
완전한 call by value
shallow copy
P1주소 ≠ P2주소
P1 맴버들의 주소 == P2 맴버들의 주소