이 글은 Python의 할당, 얕은 복사, 깊은 복사에 대한 간략한 소개(예제)를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
dict 데이터 유형을 작성할 때 "할당문"과 copy() 함수에 대해 언급했습니다.
실제로 깊은 복사와 얕은 복사의 경우 특정 데이터 유형을 고려해야 합니다. 한 부분은 숫자, 문자열과 같은 불변 개체이고, 다른 부분은 목록, 사전 등과 같은 변경 가능한 개체입니다.
변수: a의 요소 객체 연결 공간을 가리키는 시스템 테이블.
Object: 실제 값을 저장하기 위해 할당된 메모리 조각입니다.
참조: 변수에서 객체로의 포인터.
불변 개체: 숫자, 문자열, 튜플과 같이 일단 생성되면 수정할 수 없습니다.
변수 개체: 목록, 사전 등 수정할 수 있는 개체입니다.
과제: "=" 문으로 구현됩니다. 왼쪽은 새로 생성된 변수이고, 오른쪽은 직접 내용이거나 기존 변수일 수 있습니다. 이는 객체에 대한 참조입니다. Python은 객체를 복사하지 않고 객체에 대한 참조만 복사합니다. 새 변수는 소스 변수의 메모리 주소를 가리킵니다.
얕은 복사: 객체를 복사합니다. 가장 바깥쪽 개체 자체가 복사되고, 내부 요소는 참조와 함께 복사됩니다. 즉, 유형이 원본 객체와 동일하고 내용이 원본 객체에 대한 참조인 새 객체가 생성됩니다. [얕은 복사본 개체는 새 개체이고 개체의 참조 내용은 오래되었습니다. 】
얕은 복사를 구현하는 여러 가지 방법: (1) 슬라이스: [:] (2) list(), dict()와 같은 팩토리 함수(3) copy()를 사용합니다.
깊은 복사: 주변 요소와 내부 요소 모두 참조가 아닌 개체 자체가 복사됩니다. 즉, 해당 개체가 한 번 복사되고 해당 개체에서 참조되는 다른 개체도 복사됩니다.
숫자, 문자열 등 불변 객체의 경우 할당(=), 얕은 복사(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 포인트가 동일하다는 것을 알 수 있습니다.
리스트 및 딕셔너리와 같은 데이터 유형의 경우 할당, 얕은 복사 및 전체 복사는 메모리 주소의 변경 사항이 다릅니다.
할당 얕은 복사: 같은 값, 같은 주소;
복사 얕은 복사본: 같은 값, 다른 주소
deepcopy: 같은 값, 다른 주소
예제 1: 'name'은 문자열이며 변경할 수 없는 객체입니다. base[1]=['age',18]은 변경 가능한 객체인 목록입니다. base_1과 base_2는 모두 base의 얕은 복사본이며 세 개는 동일한 id()를 갖습니다.
첫 번째 문자열 요소를 다르게 변경하면 문자열(불변)이 복사본으로 표시되고 수정되면 새 문자 개체가 생성되므로 ID가 다르며 서로 영향을 미치지 않는 것으로 확인됩니다.
두 번째 목록 요소를 수정하는 경우 다른 수정 사항은 마지막 수정 시에만 적용되며 서로 영향을 미칩니다. 두 번째 요소 목록은 단순히 해당 참조를 복사하고 얕은 복사본을 수정하면 참조된 콘텐츠가 수정되기 때문입니다.
예 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의 할당 및 얕은 복사 및 전체 복사에 대한 간략한 소개(예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!