>백엔드 개발 >파이썬 튜토리얼 >Python의 할당 및 얕은 복사 및 전체 복사에 대한 간략한 소개(예제)

Python의 할당 및 얕은 복사 및 전체 복사에 대한 간략한 소개(예제)

不言
不言원래의
2018-08-30 10:11:401325검색

이 글은 Python의 할당, 얕은 복사, 깊은 복사에 대한 간략한 소개(예제)를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

dict 데이터 유형을 작성할 때 "할당문"과 copy() 함수에 대해 언급했습니다.
실제로 깊은 복사와 얕은 복사의 경우 특정 데이터 유형을 고려해야 합니다. 한 부분은 숫자, 문자열과 같은 불변 개체이고, 다른 부분은 목록, 사전 등과 같은 변경 가능한 개체입니다.

1. 정의 및 설명

  • 변수: a의 요소 객체 연결 공간을 가리키는 시스템 테이블.

  • Object: 실제 값을 저장하기 위해 할당된 메모리 조각입니다.

  • 참조: 변수에서 객체로의 포인터.

  • 불변 개체: 숫자, 문자열, 튜플과 같이 일단 생성되면 수정할 수 없습니다.

  • 변수 개체: 목록, 사전 등 수정할 수 있는 개체입니다.

  • 과제: "=" 문으로 구현됩니다. 왼쪽은 새로 생성된 변수이고, 오른쪽은 직접 내용이거나 기존 변수일 수 있습니다. 이는 객체에 대한 참조입니다. Python은 객체를 복사하지 않고 객체에 대한 참조만 복사합니다. 새 변수는 소스 변수의 메모리 주소를 가리킵니다.

  • 얕은 복사: 객체를 복사합니다. 가장 바깥쪽 개체 자체가 복사되고, 내부 요소는 참조와 함께 복사됩니다. 즉, 유형이 원본 객체와 동일하고 내용이 원본 객체에 대한 참조인 새 객체가 생성됩니다. [얕은 복사본 개체는 새 개체이고 개체의 참조 내용은 오래되었습니다. 】
    얕은 복사를 구현하는 여러 가지 방법: (1) 슬라이스: [:] (2) list(), dict()와 같은 팩토리 함수(3) copy()를 사용합니다.

  • 깊은 복사: 주변 요소와 내부 요소 모두 참조가 아닌 개체 자체가 복사됩니다. 즉, 해당 개체가 한 번 복사되고 해당 개체에서 참조되는 다른 개체도 복사됩니다.

2. 불변 객체

숫자, 문자열 등 불변 객체의 경우 할당(=), 얕은 복사(copy()), 전체 복사(deepcopy()) 간에 차이가 없습니다. 객체 참조는 항상 동일한 메모리 주소를 가리킵니다.
예시:

>>> var_1 = 123
>>> id(var_1)            # 通过id()查看地址
1615552144
>>> var_2 = var_1
>>> id(var_2)
1615552144
>>>
>>> import copy        # 浅、深拷贝需要导入copy模块
>>> var_3 = copy.copy(var_1)
>>> id(var_3)
1615552144
>>>
>>> var_4 = copy.deepcopy(var_1)
>>> id(var_4)
1615552144

var_1 ~ var_4의 ID 포인트가 동일하다는 것을 알 수 있습니다.

3. 변수 객체

리스트 및 딕셔너리와 같은 데이터 유형의 경우 할당, 얕은 복사 및 전체 복사는 메모리 주소의 변경 사항이 다릅니다.
할당 얕은 복사: 같은 값, 같은 주소;
복사 얕은 복사본: 같은 값, 다른 주소
deepcopy: 같은 값, 다른 주소

예제 1: 'name'은 문자열이며 변경할 수 없는 객체입니다. base[1]=['age',18]은 변경 가능한 객체인 목록입니다. base_1과 base_2는 모두 base의 얕은 복사본이며 세 개는 동일한 id()를 갖습니다.
첫 번째 문자열 요소를 다르게 변경하면 문자열(불변)이 복사본으로 표시되고 수정되면 새 문자 개체가 생성되므로 ID가 다르며 서로 영향을 미치지 않는 것으로 확인됩니다.
두 번째 목록 요소를 수정하는 경우 다른 수정 사항은 마지막 수정 시에만 적용되며 서로 영향을 미칩니다. 두 번째 요소 목록은 단순히 해당 참조를 복사하고 얕은 복사본을 수정하면 참조된 콘텐츠가 수정되기 때문입니다.

Python의 할당 및 얕은 복사 및 전체 복사에 대한 간략한 소개(예제)

예 2: Deep Copy

사전 객체를 생성하고 Deep Copy를 사용하여 새 객체를 생성합니다.

>>>import copy
>>> var = {"a":1,"b":2,"c":[3,'abc']}
>>> var1 = copy.deepcopy(var)
>>> id(var),id(var1)
(17616992, 15671136)            # 地址不相同
>>> id(var['c']),id(var1['c'])
(15695144, 15695384)        
>>> id(var['c'][0]),id(var1['c'][0])
(1615550224, 1615550224)        # ‘c’元素的内存地址是相同的
>>>
>>> var1['c'][0] = 4
>>> var
{'a': 1, 'b': 2, 'c': [3, 'abc']}
>>> var1
{'a': 1, 'b': 2, 'c': [4, 'abc']}
>>> id(var['c'][0]),id(var1['c'][0])
(1615550224, 1615550240)        # 对var1的修改没有影响var

관련 권장 사항:

Python에서 할당 연산자 구성


Python의 할당, 얕은 복사 및 전체 복사 소개

위 내용은 Python의 할당 및 얕은 복사 및 전체 복사에 대한 간략한 소개(예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.