대입 연산자를 통한 복사는 해당 객체의 주소(id)값을 복사하는 개념임.
따라서, 해당 주소를 복사한 다른 리스트의 일부 값을 변경할 경우, 이를 참조하는 모든 변수에 영향을 줌.
original_list = [1,2,3]
copy_list = original_list
print(original_list, copy_list)
copy_list[0] = 'hello'
print(original_list, copy_list)
#['hello', 2, 3] ['hello', 2, 3]
slice 연산자를 활용하여 같은 원소를 가진 새로운 리스트를 생성하는 방식
a = [1, 2, 3]
b = a[:]
print(a, b) # [1, 2, 3] [1, 2, 3]
b[0] = 5
print(a, b) # [1, 2, 3] [5, 2, 3]
📢 복사하는 리스트의 원소가 주소를 참조하는 경우
즉, 이차원 이상의 배열인 경우, 리스트 원소 내의 리스트는 마찬가지로 주소를 참조하게 되어, 영향을 받을 수 있음.
a = [1, 2, [1, 2, 3]]
b = a[:]
print(a, b) # [1, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
b[2][0] = 5
print(a, b) # [1, 2, [5, 2, 3]] [1, 2, [5, 2, 3]]
만일 중첩된 상황에서 복사를 하고 싶다면, **깊은 복사(deep copy)**
를 해야 함.
깊은 복사는 새로운 객체를 만들고 원본 객체 내에 있는 객체에 대한 복사를 재귀적으로 삽입
단, 깊은 복사를 하기 위해서는 copy
모듈의 deepcopy
메서드 필요.
import copy
a = [1, 2, [1, 2, 3]]
b = copy.deepcopy(a)
print(a, b) # [1, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
b[2][0] = 5
print(a, b) # [1, 2, [1, 2, 3]] [1, 2, [5, 2, 3]]