소개
인기 프로그래밍 언어인 Python은 다음과 같은 경우 특이한 동작을 나타냅니다. 할당 연산자(=)를 통해 변수에 개체를 할당합니다. 일반적으로 복사라고 하는 이 동작은 예상치 못한 결과를 초래하는 경우가 많습니다. 이 개념을 풀기 위해 일반적인 예를 살펴보겠습니다.
문제: 복사 대 복사
다음 코드를 고려하세요.
dict_a = dict_b = dict_c = {} dict_c['hello'] = 'goodbye' print(dict_a) print(dict_b) print(dict_c)
이 코드는 세 개의 별도 사전을 생성하고 이를 비우도록 초기화한 다음 dict_c만 수정할 것으로 예상할 수 있습니다. 예상되는 출력은 다음과 같습니다.
{} {} {'hello': 'goodbye'}
그러나 Python의 복사 동작은 다른 결과를 생성합니다.
{'hello': 'goodbye'} {'hello': 'goodbye'} {'hello': 'goodbye'}
설명: 참조 할당
이 동작을 이해하는 열쇠는 Python의 변수 특성에 있습니다. Python에서 변수(또는 이름)는 단지 메모리에 저장된 실제 객체에 대한 포인터일 뿐입니다. 한 변수를 다른 변수에 할당할 때 할당 연산자(=)는 한 변수에서 다른 변수로 메모리 주소(또는 포인터)를 복사합니다. 이 예에서는
dict_a = dict_b = dict_c
이는 dict_a, dict_b 및 dict_c가 모두 메모리의 동일한 사전 개체를 가리킨다는 의미입니다. 따라서 dict_c가 수정되면 세 변수 모두 동일한 수정을 보게 되어 복사 효과가 발생합니다.
문제 해결: 복사 방법 사용
방지하려면 복사 동작을 사용하려면 기본 개체의 복사본을 명시적으로 만들어야 합니다. Python은 이 목적을 위해 두 가지 메서드를 제공합니다.
예:
dict_a = dict_b.copy() dict_c = copy.deepcopy(dict_a) dict_c['hello'] = 'goodbye' print(dict_a) # {'hello': 'goodbye'} (shallow copy, affected) print(dict_b) # {} (unaffected) print(dict_c) # {'hello': 'goodbye'} (deep copy, unaffected)
이러한 복사 방법을 사용하면 개체의 독립적인 복사본을 만들고 복사 동작을 피할 수 있습니다.
위 내용은 Python 할당이 변경 가능한 개체에 대해 예기치 않은 동작을 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!