반응형
python 에는 변경할 수 있는 mutable 객체가 아닌 immutable 객체가 있다.
- list는 mutable한 객체이다.
얕은 복사
- 원본에 영향 O
import copy
s = [10, 20, 30]
v = s
print(id(s), id(v))
print(id(s[0]), id(v[0]))
v[2] = 99
print(s) # 원본 출력
print(v)
깊은 복사
- 원본에 영향 X
import copy
s = [10, 20, 30]
v = copy.deepcopy(s)
print(id(s), id(v))
print(id(s[0]), id(v[0]))
v[2] = 99
print(s) # 원본 출력
print(v)
깊은 복사처럼 보이는 얕은 복사
얼핏보면 원본에 영향을 주지 않으므로 깊은 복사 같지만.
- 인덱스 슬라이싱도 얕은 복사에 해당
- copy 모듈의 copy 메소드도 얕은 복사
import copy
s = [10, 20, 30]
v2 = s[0:]
v3 = copy.copy(s)
print(id(s), id(v2), id(v3))
print(id(s[0]), id(v2[0]), id(v3[0]))
v2[2] = 99
v3[0] = 5
print(s) # 원본 출력
print(v2)
print(v3)
mutable 객체 안에 mutable 객체가 있는 경우 문제가 발생한다.
- 리스트 변수 자체는 다른 메모리 주소를 가진것으로 보일 수 있지만
안에 내부원소들은 서로 같은 주소를 바라보고 있다.
ex) 리스트 안에 또 다른 리스트
copy를 사용한 list 복사
l1 = [[1,2],[3,4]]
l2 = l1.copy()
l1[1] = [0] * 3
l1[0][0] = 10
l2[0][1] = 20
for x in (l1 , l2) :
print(id(x), x)
copy.deepcopy를 사용한 list 복사
import copy
l1 = [[1,2],[3,4]]
l3 = copy.deepcopy(l1)
l1[1] = [0] * 3
l1[0][0] = 10
l3[0][1] = 20
for x in (l1 , l3) :
print(id(x), x)
반응형
'프로그래밍 언어 > Python' 카테고리의 다른 글
[python] 파이썬 리스트 (list) (0) | 2021.08.21 |
---|---|
[python] 파이썬 세트 (set) (0) | 2021.08.18 |
[python] 파이썬 튜플 (tuple) (0) | 2021.08.18 |
[python] 파이썬으로 수학 산술자 / 수식 표현 (0) | 2021.08.17 |
[python] 키워드 인수(sep, end) 활용해서 출력 (0) | 2021.08.16 |
댓글