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

파이썬에서 여러 변수에 같은 값을 할당할 때 발생하는 문제와 해결 방법

파이썬에서는 여러 변수에 한 번에 값을 할당할 수 있습니다. 하지만 이때 주의해야 할 중요한 함정이 있습니다. 다음 코드를 살펴보겠습니다.

a = b = c = [0, 3, 5]
a[0] = 10

위 코드를 실행한 후 각 변수를 확인하면 다음과 같은 결과를 얻게 됩니다.

a, b, c: [10, 3, 5]

왜 이런 현상이 발생할까요?

a = b = c = [0, 3, 5]처럼 작성하면 세 변수가 모두 동일한 리스트 객체를 가리키게 됩니다. 즉, 메모리상에 존재하는 하나의 리스트를 세 개의 이름이 함께 참조하고 있는 것입니다.

따라서 a[0] = 10으로 값을 수정하면, 그 변경 사항이 a, b, c 세 변수 모두에 반영됩니다. 리스트와 딕셔너리 같은 변경 가능(mutable)한 객체에서 특히 자주 발생하는 문제입니다.

copy 모듈로 독립적인 객체 만들기

각 변수가 서로 영향을 주지 않는 독립적인 객체를 가지려면 copy 모듈의 deepcopy() 함수를 사용하면 됩니다. 이 함수는 원본 객체를 완전히 복제한 새로운 객체를 생성합니다.

예제

import copy

a = [0, 3, 5]
b = copy.deepcopy(a)
a[0] = 5

print(a)
print(b)

출력 결과

[5, 3, 5]
[0, 3, 5]

실행 결과를 보면 a의 첫 번째 요소를 변경했지만, b는 전혀 영향을 받지 않았습니다. deepcopy()가 원본과는 별개의 새로운 리스트를 만들었기 때문입니다.

참고: 얕은 복사와 깊은 복사

copy 모듈에는 두 가지 복사 방법이 있습니다.

  • 얕은 복사(shallow copy): copy.copy(a) — 최상위 객체만 새로 만들고, 내부에 중첩된 객체는 원본과 공유합니다.
  • 깊은 복사(deep copy): copy.deepcopy(a) — 중첩된 객체까지 재귀적으로 모두 복사하여 완전히 독립적인 복사본을 만듭니다.

중첩된 리스트나 딕셔너리를 다룰 때는 깊은 복사를 사용하는 것이 안전합니다. 숫자나 문자열 같은 불변(immutable) 객체는 재할당 시 새로운 객체가 생성되므로 이러한 문제가 발생하지 않습니다.