티스토리 뷰
인스턴스를 복사할 때는 같은 주소값을 바로보는 얇은 복사
다른 주소값을 바로보는 서로 영향을 받지 않는 깊은 복사가 있다.
이것은 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 |
- Total
- Today
- Yesterday
- 파이썬 독학
- 모바일 스킨 적용
- gitignore
- wsgi
- 엑셀 비교
- django
- admin.py
- chatbot
- 파이썬
- gitlab
- 문과 코딩
- Python
- 파이썬 강좌
- Tistory
- django chatbot
- 플러스친구 자동응답
- 장고 플러스친구 자동응답
- 파이썬 입문
- 문서 비교
- 면접정답
- 면접답변
- 장고 카톡 자동응답
- virtualenv
- 모바일 테마 적용
- 장고
- GIT
- 이미지 비교
- 파이썬 프로그래밍
- pycrypto
- PuTTYGen
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |