> 백엔드 개발 > 파이썬 튜토리얼 > Python 할당이 변경 가능한 개체에 대해 예기치 않은 동작을 표시하는 이유는 무엇입니까?

Python 할당이 변경 가능한 개체에 대해 예기치 않은 동작을 표시하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-07 20:25:16
원래의
468명이 탐색했습니다.

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Python 할당의 복사 동작

소개

인기 프로그래밍 언어인 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.copy(): 사전의 최상위 요소를 복사하는 얕은 복사본을 만듭니다.
  • copy.deepcopy(): 사전.

예:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿