Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 딕셔너리 복사 방법: copy() 메서드와 = 연산자의 차이

딕셔너리(dictionary)는 순서가 없고, 변경 가능하며, 키 기반으로 접근할 수 있는 파이썬의 대표적인 자료구조입니다. 파이썬에서 딕셔너리는 중괄호({})를 사용해 작성하며, 각 요소는 키(key)와 값(value)의 쌍으로 구성됩니다.

딕셔너리를 복사하는 방법에는 크게 두 가지가 있습니다. 바로 copy() 메서드를 사용하는 방법과 = 연산자를 사용하는 방법입니다. 이 두 방식은 겉보기에 비슷하지만 동작 결과가 완전히 다르므로, 그 차이를 정확히 이해하는 것이 매우 중요합니다. copy() 메서드는 딕셔너리의 얕은 복사본(shallow copy)을 반환하여 원본과 복사본이 서로 독립적으로 동작하게 만듭니다.

copy() 메서드를 사용한 복사

copy() 메서드로 딕셔너리를 복사한 뒤, 복사본의 모든 요소를 삭제해 보겠습니다.

# 딕셔너리 생성
original = {1:'vishesh', 2:'python'}

# copy() 함수로 복사
new = original.copy()

# new의 모든 요소 삭제
copy()는 얕은 복사를 수행하므로 new만 비워집니다.
new.clear()

print('new: ', new)
print('original: ', original)

= 연산자를 사용한 복사

이번에는 같은 작업을 = 연산자로 수행해 보겠습니다.

original = {1:'one', 2:'two'}

# = 연산자로 복사(참조 할당)
new = original

# new의 모든 요소 삭제 후 두 딕셔너리 출력
new.clear()

print('new: ', new)
print('original: ', original)

실행 결과

new:  {}
original:  {1: 'vishesh', 2: 'python'}

new:  {}
original:  {}

결과 분석

copy() 메서드를 사용한 첫 번째 경우를 보면, new.clear()로 복사본의 모든 요소를 삭제했음에도 원본 딕셔너리 original은 그대로 유지됩니다. 이는 copy()가 호출될 때 새로운 딕셔너리 객체를 생성하고, 그 안에 원본의 키와 값을 복제하기 때문입니다. 따라서 복사본을 수정해도 원본에는 아무런 영향을 주지 않습니다.

반면 = 연산자를 사용한 두 번째 경우에는 결과가 완전히 다릅니다. new = original은 새로운 객체를 만드는 것이 아니라, original이 가리키는 동일한 딕셔너리 객체를 참조하도록 하는 할당입니다. 즉, 두 변수는 하나의 객체를 공유합니다. 따라서 new.clear()를 실행하면 공유된 객체 자체가 비워지므로, original까지 함께 비워지게 됩니다.

정리

딕셔너리를 복사할 때 원본을 보존해야 한다면 반드시 copy() 메서드를 사용해야 합니다. 단순히 =로 할당하면 복사가 아니라 참조 공유가 일어나기 때문에, 한쪽을 수정하면 다른 쪽도 함께 변경되는 의도치 않은 결과가 발생할 수 있습니다.