티스토리 뷰

인스턴스를 복사할 때는 같은 주소값을 바로보는 얇은 복사


다른 주소값을 바로보는 서로 영향을 받지 않는 깊은 복사가 있다.


이것은 immutable 객체에서는 얇은 복사가 별로 신경 쓸 필요가 없고 


mutable 객체에서만 얇은 복사되는것을 조심하면 된다.


어차피 immutable 은 얇은 복사여도 변경 불가능한 immutable 이기 때문이다.




[shallow copy: 얇은 복사]



immutable 객체는 건너뛰고 mutable 객체를 살펴 보겠다.


a = [1, 2, 3]
b = a
print(id(a), id(b))


a 를 b 에 할당 하고 id 함수를 통해 a, b 의 주소값을 출력하였다.


둘다 동일하게 나온다. 같으 주소를 가르키고 있는 것이다.


a = [1, 2, 3]
b = a
a[0] = 99
print(a, b)


이때 a[0] 를 수정하였더니 b[0] 도 수정 되었다.


같은 주소를 가르키고 있는 상태, a가 변경되면 b 도 같이 변경되는 상태


즉 완전 새로운 메모리 영역에 할당된 상태가 아니다


이것을 얇은 복사라고 한다.




슬라이싱에 대해서도 살펴 보자

a = [[1, 2], [3, 4]]
b = a[:]
print(id(a), id(b))

일반적으로 슬라이싱을 하면 완전 새로운 얇은 복사가 아니라고 알고 있다.


실제로 위의 코드에서 a, b 는 서로 다른 아이디를 가지고 있다



a = [[1, 2], [3, 4]]
b = a[:]
print(id(a[0]), id(b[0]))

a, b 는 다른 주소 였지만 a[0], b[0] 는 같은 주소를 가르키고 있다.


리스트 안에 단일 변수이면 깊은 복사 처럼 동작 하지만


결국 리스트 안에 내부 객체는 얇은 복사


a = [[1, 2], [3, 4]]
b = a[:]
print(id(a), id(b))
a[0][0] = 99
print(id(a[0]), id(b[0]))
print(a, b)


a[0][0] 를 바꾸면 b[0][0] 바뀐다



a = [[1, 2], [3, 4]]

b = list()
for item in a:
b.append(item)

b[0][0] = - 1
print(a, b)

이렇게 for 문으로 한다고 해도 마찬가지로 shallow copy 가 된다.




[deep copy: 깊은 복사]



깊은 복사는 내부에 객체들까지 모두 새롭게 복사 되는 것이다


copy 모듈의 deepcopy 를 이용해 보자


import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
print(id(a[0]), id(b[0]))
a[0][0] = - 99
print(a, b)




'python lecture > basic' 카테고리의 다른 글

[edu] 튜플 (tuple)  (0) 2019.01.30
[edu] set 컴프리헨션 (set comprehensions)  (0) 2019.01.30
[edu] __slots__ (__dict__)  (0) 2019.01.30
[edu] format (문자열, str)  (0) 2019.01.29
[edu] 입출력 (input, print)  (0) 2019.01.29
댓글