본문 바로가기

Language/Python

자료형의 복사 .copy() 와 .deepcopy()

a = 3
b = a

b = b + 1

print(b)	# 4
print(a)	# 3

 

위 코드를 보면, 특별히 문제가 없어 보인다.

 

그런데,

 

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

b[2] = 0

print(b)	# [1, 2, 0, 4]
print(a)	# [1, 2, 0, 4]

 

a를 리스트로 선언하면 b의 세 번째 값을 변경했을 때 a도 같이 변경된다. 앞의 예시처럼 a 따로, b 따로 변동된 사항이 적용되는 것이 아닌 것이다.

 

list, dictionary, set 등 mutable 한 속성을 가진 것들은 이처럼 처음에 같은 데이터를 가리키고 있었다면 하나를 변경했을 때 다른 것도 같이 변한다는 특징을 가진다.

 

이러한 현상을 방지하고 싶다면, 자료형의 복사를 해야 한다.

 

a = [1, 2, 3, 4, 5]
b = a.copy()

b[2] = 0

print(b)	# [1, 2, 0, 4, 5]
print(a)	# [1, 2, 3, 4, 5]

 

이처럼 .copy() 의 함수를 사용하면 되는 것이다. 그런데 .copy() 도 한계가 있다. 만약 리스트가 다중 리스트라면

 

c = [1, 2, 3, [4, 5, 6]]
d = c.copy()

d[3][1] = 0

print(d)	# [1, 2, 3, [4, 0, 6]]
print(c)	# [1, 2, 3, [4, 0, 6]]

 

이렇게 두 레이어 내부의 요소는 변경했을 때 .copy() 를 한 상태라도 같이 변경된다는 것이다. 이것을 방지하려면 copy 라는 모듈을 import 하고 .deepcopy() 라는 함수를 사용해야 한다.

 

import copy

c = [1, 2, 3, [4, 5, 6]]
d = copy.deepcopy(c)

d[3][1] = 0

print(d)	# [1, 2, 3, [4, 0, 6]]
print(c)	# [1, 2, 3, [4, 5, 6]]

 

이렇게 다중 레이어까지 완벽하게 복사할 수 있는 것이다.

'Language > Python' 카테고리의 다른 글

문자열 포매팅  (1) 2022.10.19
람다(lambda) - Python  (0) 2022.05.14