Python 직접 할당,딥 복사,얕 은 복사

직접 할당:대상 의 인용,즉 대상 에 게 별명 을 짓 는 것 입 니 다.
얕 은 복사:부모 대상 을 복사 하지만 대상 내부 의 하위 대상 을 복사 하지 않 습 니 다.
심 한 복사:부모 대상 을 복사 하고 그 내부 의 하위 대상 을 복사 합 니 다.
이전 글 에서 언급가 변 대상 과 불가 변 대상한 다음 에 도 이 두 가지 차이 로 전개 된다.
직접 할당
가 변 대상 과 가 변 대상 에 대해 하나의 변 수 를 다른 변수 에 직접 할당 합 니 다.이들 의 id 값 은 일치 합 니 다.사실은 본질 적 으로 변 수 량 을 대상 에 연결 하 는 과정 입 니 다.

>>> a=1
>>> b=a
>>> id(a) == id(b)
True
>>> c="string"
>>> d=c
>>> id(c) == id(d)
True
>>> e=[1,2,3]
>>> f=e
>>> id(e)==id(f)
True
새로운 변수의 값 을 수정 하 는 것 이 기 존 변수 에 미 치 는 영향 에 대해가 변 대상 과 불가 변 대상에서 도 설명 하 였 으 며,여기 서 몇 가지 예 를 통 해 다시 복습 하 였 다.
불가 변 대상

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True
>>>>>> id(x)
1500143776
>>> y=y+1
>>> y
2
>>> x
1
>>> id(x)==id(y)
False
>>> id(y)
1500143808
>>> id(x)
1500143776
가 변 적 이지 않 은 대상 에 대해 할당 을 수정 한 후의 새로운 변 수 는 기 존 변수 에 아무런 영향 을 주지 않 습 니 다.왜 이런 현상 이 발생 합 니까?가 변 대상 이 생 성 되면 변경 할 수 없 기 때 문 입 니 다.나중에 y 에 대한 작업 은 대상 을 다시 만 들 고 연결 한 결과 입 니 다.

가 변 대상

>>> m=[1,2,3]
>>> n=m
>>> id(n)==id(m)
True
>>> id(m)
1772066764488
>>> id(n[0])
1772066764656
>>> n[0]=4
>>> n
[4, 2, 3]
>>> m
[4, 2, 3]
>>> id(n)==id(m)
True
>>> id(m)
1772066764488
가 변 대상 에 대해 할당 후의 변 수 를 수정 하면 기 존의 변수 에 영향 을 주 고 value 값 의 변 화 를 초래 할 수 있 으 나id 값 은 변 하지 않 습 니 다.

위의 그림 에서 알 수 있 듯 이 이때 의 id(n[0])의 값 은 수정 되 지 않 은 id 값 과 다 를 것 입 니 다.출력 해 보 세 요.

>>>id(n[0])
1772066764752 #          1772066764656
n[0]수정 전후 에 왜 id 값 이 바 뀌 었 습 니까?먼저 명확 하 게n[0] 바 인 딩 된 것 은 가 변 적 이지 않 은 대상 입 니 다.글 의 최초 언급 에 따 르 면 가 변 적 이지 않 은 대상 이 만 들 면 수정 을 허용 하지 않 습 니 다.분명히 n[0]을 수정 하고 바 인 딩 대상 의 메모리 에서 수정 할 수 없습니다.그러면 어떻게 재 할당 을 실현 합 니까?새로운 대상4을 만 들 고n[0] 을 새로운 대상 에 연결 할 수 있 습 니 다.
얕 은 복사 와 깊 은 복사
공식 문서 의 정 의 를 먼저 봅 시다.
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or
class instances).
A shallow copy constructs a new compound object and then (to the
extent possible) inserts the same objects into it that the
original contains.
A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.
문서 에서 알 수 있 듯 이 위 에서 언급 한 깊 은 복사 와 얕 은 복사 두 가지 차 이 는 복합 대상 에 있 고 그 다음 에 도 복합 대상 만 토론 할 것 이다.
얕 은 복사
공식 문서 에서 도 얕 은 복사 와 깊 은 복사 에 대한 정 의 를 언급 한 것 을 알 수 있다.앞에서 알 수 있 듯 이 얕 은 복사 로 복합 대상 을 구축 한 다음 에 기 존의 복합 대상 에 포 함 된 대상 을 새로운 복합 대상 에 삽입 하 는 것 이 어렵 지 않다.

위의 그림 에서 알 수 있 듯 이 얕 은 복사 후 새로운 복합 대상 에 포 함 된 대상(가 변 또는 가 변 하지 않 음)의 id 값 은 기 존 대상 에 포 함 된 대상 의 id 값 과 같 습 니 다.
구체 적 인 예 를 살 펴 보 자.

>>> import copy
>>> a=[1,2,[3,4]]
>>> b=copy.copy(a)
>>> id(b[0])==id(a[0])
True
>>> id(b[2])==id(a[2])
True
>>> id(b[2][0])==id(a[2][0])
True
이제 얕 은 복사 후의b값 을 수정 해 보 자.수정 하기 전에 수정b[0]하면 무슨 일이 일어 날 지 먼저 생각해 보 자.b[0] = 11 은 가 변 적 이지 않 은 대상 에 속 하기 때문에 가 변 적 이지 않 은 변수 에 대한 규칙 에 따라b[0]새로운 변수 에 연결 되 고 a[0]는 수정 되 지 않 았 기 때문에 변 하지 않 습 니 다.정말 그렇습니까?검증 해 봅 시다.

>>> b[0]=5
>>> b
[5, 2, [3, 4]]
>>> a
[1, 2, [3, 4]]
다음 에 우 리 는 수정 b[2]을 시도 해 보 겠 습 니 다. b[2]바 인 딩 대상 은list이 고 가 변 대상 에 속 하기 때문에 위 에서 말 한 가 변 대상 이 수정 한 규칙 에 따라 수 정 된b[2]id값 은 변 하지 않 지만 그value값 은 변 할 것 입 니 다.똑 같이 예 를 들 어 검증 해 보 겠 습 니 다.

>>> id(b[2])
4300618568
>>> b[2][0]=6
>>> id(b[2])
4300618568
>>> b
[5, 2, [6, 4]]
>>> a
[1, 2, [6, 4]]
b[2]a[2]가 같은 가 변 대상 을 연결 하기 때문에b[2] 에 대한 수정 도a[2] 에 나타 날 것 이 분명 하 다.
딥 카피
깊이 복사 하여 복합 대상 을 구축 한 다음 에 원래 복합 적 으로 포 함 된 대상 의 사본 을 새로운 복합 대상 에 재 귀적 으로 삽입 합 니 다.

위의 그림 에서 보 듯 이 깊이 복사 한 후에 새로운 복합 대상 에 포 함 된 대상 이 대상 이 가 변 대상 이 라면 id 값 은 변 하지 않 고 대상 이 가 변 대상 이 라면 id 값 이 변 합 니 다.
예 를 들 어:

>>> import copy
>>> a=[1,2,[3,4]]
>>> b=copy.deepcopy(a)
>>> id(b[0])==id(a[0])
True
>>> id(b[2])==id(a[0])
False
>>> id(b[2][0])==id(a[2][0])
True
다음은 변수b를 수정 합 시다.여 기 는 가 변 대상b[0]b[1]을 수정 하지 않 습 니 다.결과 가 뚜렷 하기 때문에 a 에 아무런 영향 을 주지 않 습 니 다.수정b[2]을 하 겠 습 니 다.그러면 수정 b[2] a[2]에 영향 을 줄 수 있 습 니까?분명 한 답 은 그렇지 않다 는 것 이다.깊 은 복사 가 새로운 개 체 를 복제 한 것 과 같 기 때문에 둘 은 더 이상 아무런 관계 가 없다.

>>> b[2][0]=5
>>> b
[1, 2, [5, 4]]
>>> a
[1, 2, [3, 4]]
이상 은 Python 의 직접 할당,깊 은 복사 와 얕 은 복사 에 대한 상세 한 내용 입 니 다.Python 의 직접 할당,깊 은 복사 와 얕 은 복사 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기