얕은 복사(shallow copy)와 깊은 복사(deep copy)
관련내용
객체들의 참조나 요소의 같음과 다름은 두 값이 같음의 여부를 판정하는 연산자 ==
와 키워드 is
로 확인할 수 있습니다.
a=[1, 2, 3] b=a; b
[1, 2, 3]
a==b
True
위 결과는 두 객체의 값이 같음을 의미합니다. 그러나 이 결과가 두 객체의 참조점의 위치를 같음을 의미하지는 않습니다. 즉, 위 결과는 다음의 결과를 보장하지 않습니다.
id(a[1])==id(b[1])
True
위 두 코드와 같이 값과 참조점의 위치가 같음은 키워드 is
에 의해 확인할 수 있습니다.
a is b
True
위 코드의 객체 b는 a를 할당한 것으로 동일한 위치에 있는 요소들을 참조합니다. 다음 코드의 list()
는 리스트 자료형의 객체를 생성하는 내장함수입니다. 이 함수에 의해 생성된 객체는 같은 값을 포함하지만 다른 참조점을 가집니다. 즉, 다른 객체입니다.
c=list(a); c
[1, 2, 3]
a==c
True
a is c
False
위의 객체들 중에 b의 첫 번째 요소값을 변경시키면 같은 참조점을 가지는 a 역시 수정됩니다. 그러나 다른 객체인 c에는 영향을 주지 않습니다.
b[0]=100; b
[100, 2, 3]
a
[100, 2, 3]
c
[1, 2, 3]
결과적으로 위의 객체 b와 c는 a를 복사한 것입니다. 그러나 b와 c는 다른 객체입니다. 이와 같이 파이썬은 객체가 객체를 복사하는 2가지 방법을 가지고 있습니다(그림 1)
얕은 복사(shallow copy)
- 위 a와 b 객체의 관계
- 동일한 참조점에 있는 요소들을 포함
- 얕은 복사에 있는 객체는 서로 연결되어 있음
깊은 복사(deep copy)
- 위 a와 c 객체의 관계
- 동일한 요소들을 가지지만 각 요소의 참조점은 다릅니다.
- 다른 객체로서 서로 영향을 주지 않음
이 관계를 그림 1과 같이 나타낼 수 있습니다.
댓글
댓글 쓰기