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 |