본문 바로가기
Python

[Python] 리스트 얕은 복사, 깊은 복사 차이

by 박사과정 모닝 2023. 10. 17.
반응형

파이썬에서 '복사한다'라고 하면 두 가지 의미를 가집니다. 얕은 복사(Shallow copy)와 깊은(Deep copy)가 그것입니다. 이 둘의 차이는 무엇일까요? 이 개념은 파이썬에서 '리스트' 객체를 복사할 때 특히 주의해야 합니다. 우리가 '복사한다'라고 하면 일반적으로 똑같은 개체를 하나 더 만드는 것을 생각합니다. 따라서 Deep copy가 '찐 복사, 진짜 복사'다! 라고만 기억하면 헷갈리지 않습니다. 차분히 다시 설명드리도록 하겠습니다.

 

리스트 변수의 특징

파이썬에서 리스트 변수는 리스트 객체를 직접 저장하고 있지 않습니다. 리스트 자체는 다른 곳에 저장되어 있고, 리스트 변수에는 리스트가 어디에 저장되어있는지를 나타내는 '참조값(Reference)' = 즉 메모리에서 리스트 객체의 주소값이 저장되는 것입니다. 따라서 우리가 '리스트를 복사한다'라고 했을 때 이 변수가 가지고 있는 '참조값'을 복사하는 것인지, 혹은 이 참조값이 가리키는 실제 데이터 자체를 복사하는 것인지를 구분하게 됩니다. 이것이 얕은 복사와 깊은 복사의 개념을 나누는 이유입니다.

 

얕은 복사(Shallow copy)

  • 얕은 복사(Shallow copy): 참조값을 복사
A = [1, 2, 3, 4, 5]
B = A
B[1] = 100
print(A) # [1, 100, 3, 4, 5]
  • 위의 둘쨋줄처럼 단순히 대입연산자를 통해 A를 B로 복사한다면, 이것은 리스트 자체가 복사되는 것이 아닌 리스트 변수 A가 가지고 있던 [1, 2, 3, 4, 5]라는 리스트의 '참조값'을 리스트변수 B로 복사하는 것입니다. 따라서 리스트 변수 A와 리스트 변수 B는 서로 같은 참조값을 가지고 있고 이 참조값은 같은 리스트를 가리키는 것입니다. 그렇기 때문에 세 번째 줄에서 리스트 변수 B의 1번 인덱스에 해당하는 값을 수정했을 때, 리스트 변수 A의 출력 결과 또한 같이 바뀐 것입니다.(사실 같이 바뀌었다고 하는 것도 100% 정확한 표현은 아닙니다. 애초에 동일한 하나의 변수를 가리키고 있으니까요.)

 

깊은 복사(Deep copy)

  • 깊은 복사(Deep copy): 리스트 자체를 복사
  • 그렇다면 우리가 원하는 대로 원본 리스트는 그대로 두면서, 똑같은 새로운 리스트를 만들려면(복사하려면) 어떻게 해야 할까요? 세 가지 방법이 있습니다.
  • list() 메소드 활용
A = [1, 2, 3, 4, 5]
B = list(A)
B[1] = 100
print(A) # [1, 2, 3, 4, 5]
print(B) # [1, 100, 3, 4, 5]
  • deepcopy() 또는 copy() 메소드 활용
from copy import deepcopy
A = [1, 2, 3, 4, 5]
B = deepcopy(A)
B[1] = 100
print(A) # [1, 2, 3, 4, 5]
print(B) # [1, 100, 3, 4, 5]
  • [:] 인덱스 활용
A = [1, 2, 3, 4, 5]
B = A[:] # A의 요소를 하나씩 모두 불러와서 B에 입력
B[1] = 100
print(A) # [1, 2, 3, 4, 5]
print(B) # [1, 100, 3, 4, 5]

 

반응형

'Python' 카테고리의 다른 글

[Python] 2차원 리스트  (1) 2023.10.22
[Python] 리스트 함축, 리스트 함축 형식, 리스트 함축 방법  (1) 2023.10.17
[Python] 리스트 연산  (0) 2023.10.13
[Python] 시퀀스 자료형  (0) 2023.10.13
[Python] 리스트  (0) 2023.10.13