[Python] 얕은 복사와 깊은 복사

cdwde·2021년 5월 6일
0
post-custom-banner

🎈 mutable vs immutable 객체

mutable

  • 변경 가능한 객체
  • list, set, dict ...
  • mutable에 속한 객체들은 값 변경이 일어날 때 객체의 값이 변경 (id는 바뀌지 않음)
a = [1, 2, 3]
print(id(a))

a[0] = 5	#a = [5, 2, 3]
print(id(a))

#출력 결과
#4393788808
#4393788808

immutable

  • 변경 불가능한 객체
  • tuple, bool, int, float, str ...

mutable한 객체의 변수 간 대입

  • b에 a를 할당하면 같은 메모리 주소를 바라봄
  • b를 변경하면 a도 바뀜
a = [1, 2, 3]
b = a	#얕은 복사
b[0] = 5
print(a)	#[5, 2, 3]
print(b)	#[5, 2, 3]

print(id(a))	#4396179528
print(id(b))	#4396179528

immutable한 객체의 변수 간 대입

  • b를 a에 할당하면 같은 메모리 주소를 바라봄
  • b에 다른 값을 할당하면 재할당이 이루어지고 메모리 주소가 변경
a = "abc"
b = a	#얕은 복사
print(a)	#abc
print(b)	#abc
print(id(a))	#4387454680
print(id(b))	#4387454680

b = "abcd"
print(a)	#abc
print(b)	#abcd
print(id(a))	#4387454680
print(id(b))	#4396456400

🎈 얕은 복사

슬라이싱, copy 모듈의 copy 메소드로 얕은 복사 하기

예제

  • 슬라이싱을 통해서 값을 할당하면 새로운 id 부여 -> 서로 영향 X
a = [1, 2, 3]
b = a[:]
print(id(a))	#4396179528
print(id(b))	#4393788808
print(a is b)	#False

b[0] = 5
print(a)	#[1, 2, 3]
print(b)	#[5, 2, 3]
  • mutable 객체 안에 mutable 객체가 있는 경우 문제
  • id(a)와 id(b) 값은 다르지만 내부의 객체 id(a[0])와 id(b[0])은 같은 주소를 보고 있음
  • a[0]에 값을 변경하면 b[0]도 변경됨
a = [[1, 2], [3, 4]]
b = a[:]
print(id(a))	#4395624328
print(id(b))	#4396179592
print(id(a[0]))	#4396116040
print(id(a[0]))	#4396116040

a[0].append(9)
print(a)	#[[1, 2, 9], [3, 4]]
print(b)	#[[1, 2, 9], [3, 4]]

🎈 깊은 복사

내부 객체들까지 모두 새롭게 copy
copy 모듈의 deepcopy 메소드 사용

from copy import deepcopy
a = [[1, 2], [3, 4]]
b = deepcopy(a)

a[0].append(9)
print(a)	#[[1, 2, 9], [3, 4]]
print(b)	#[[1, 2], [3, 4]]

참고
https://wikidocs.net/16038

post-custom-banner

0개의 댓글