이전 장:설정하고 냉동 설정
다음 장:기

얕고 깊은 복사

소개


으로 우리가 본 장에서”데이터의 유형과 변수”, 파이썬은 이상한 행동과 비교하여 다른 프로그래밍 언어에 할당할 때고를 복사하고 간단한 데이터 같은 종류의 정수 문자열입니다. 의 차이는 얕고 깊은 복사만에 대한 관련 복합체는 개체를 포함하는 다른 물체처럼,목록 또는 클래스의 인스턴스가 있습니다.,
에서 다음과 같은 코드 y 같은 메모리보다 X. 이 변경할 때,우리는 할당을 다른 값을 y. 이 경우에는 y 을 받는 별도의 메모리 위치로 우리가 본 장에서”데이터의 유형과 변수”.

>>> x = 3>>> y = x

그러나 이 경우 내부적 행동이 나타나 이상에 비해 프로그래밍 언어로는 C,C++,Perl,아직 관찰할 수 있는 결과를 배정의 응답은 우리의 기대 이상이었습니다. 그러나 목록 및 사전과 같은 변경 가능한 객체를 복사하는 경우 문제가 될 수 있습니다.
Python 은 필요한 경우에만 실제 복사본을 만듭니다., 프로그래머 인 사용자가 명시 적으로 요구하는 경우.
변경 가능한 객체를 복사 할 때,즉 목록과 사전을 복사 할 때 발생할 수있는 가장 중요한 문제를 소개합니다.

를 복사하 list

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

위의 예에서 간단한 목록에 할당된 colours1. 다음 단계에서는 colour1 을 colours2 에 할당합니다. 이 후 새 목록이 colors2 에 할당됩니다.
예상했듯이 colours1 의 값은 변경되지 않았습니다., 그것 같이 우리에 나와 있는 예제에 대해 이 장은”데이터의 유형과 변수”새로운 메모리 위치에 할당되었을 위한 colours2 기 때문에,우리는 할당 완전히 새로운 목록을 이 변수입니다.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

하지만 질문은 무슨 일이 일어날 경우 우리는 변화의 요소의 목록 colours2 또는 colours1?
위의 예에서 colours2 의 두 번째 요소에 새 값을 할당합니다. 초심자의 제비는 colours1 의 명부가”자동적으로”또한 변화되었다는 것을 놀랠 것이다.,
설명은 colours2 에 대한 새로운 할당이 없었으며 그 요소 중 하나에만 할당되었다는 것입니다.

사본을 가진 슬라이스 Operator

그것은 완전히 사본을 얕은 목록의 구조와 슬라이스 운영자 없이 모든 측면을 효과는 우리가 위에서 설명:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

그러나 빨리 목록을 포함 하위,우리는 같은 어려움,즉 단지 포 thesublists.,

>>> lst1 = ]>>> lst2 = lst1

이 행동을 묘사에 다음과 같은 다이어그램


할당하는 경우 새로운 값을 0 번째 요소 중 하나의 두 가지 목록은 없을 것입니다. 하위 목록의 요소 중 하나를 변경하면 문제가 발생합니다.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

다음과 같은 다이어그램을 묘사한 어떻게 될 경우,하나의 요소의 하위 변경됩니다:모두의 콘텐츠 lst1 및 lst2 이 변경되었습니다.,

방법을 사용하여 deepcopy 모듈에서 복사본

솔루션을 설명한 문제이는 모듈을 사용하”copy”. 이 모듈은”복사”메소드를 제공합니다.임의의 목록,즉 얕은 목록과 다른 목록.
다음과 같은 스크립트를 사용하여 위의 예와 이 방법을

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

경우 우리는 이 스크립트는 아래의 이름을 deep_copy.py 그리고 우리는 스크립트를 호출합”python deep_copy.,py”우리는 다음과 같은 출력이 나타납니다.:

$ python deep_copy.py ]]

이전 장:설정하고 냉동 설정
다음 장:기

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다