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] = 1
1 은 가 변 적 이지 않 은 대상 에 속 하기 때문에 가 변 적 이지 않 은 변수 에 대한 규칙 에 따라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 의 직접 할당,깊 은 복사 와 얕 은 복사 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.