Python 의 대상 참조 및 복사 코드 예제

Python 은 할당 이 없고 인용 만 있다 고 할 수 있 습 니 다.당신 이 이렇게 하 는 것 은 자신 을 인용 하 는 구 조 를 만 드 는 것 과 같 기 때문에 무한 순환 을 초래 하 는 것 입 니 다.이 문 제 를 이해 하기 위해 서 는 기본 개념 을 분명히 해 야 한다.
Python 에는'변수'가 없습니다.우리 가 평소에 말 하 는 변 수 는'태그'일 뿐 인용 입 니 다.
python 에서"a=b"는 대상 a 참조 대상 b 를 표시 합 니 다.대상 a 자체 가 메모리 공간 을 따로 분배 하지 않 았 습 니 다(중요:복사 가 아 닙 니 다!).그것 은 컴퓨터 에 저 장 된 대상 b 의 메모 리 를 가리킨다.따라서 한 대상 을 다른 대상 으로 복사 하려 면 등호 로 간단하게 조작 할 수 없고 다른 방법 을 사용 해 야 한다.예 를 들 어 시퀀스 클래스 의 대상 은(목록,원본)절편 연산 자(즉':')를 사용 하여 복사 해 야 합 니 다.
python 에서 b=a 와 같은 값 을 할당 할 때 a 에 대한 새로운 인용 만 만 만 들 고 a 의 인용 수 를 1 로 늘 리 며 새로운 대상 을 만 들 지 않 습 니 다.

>>> a = 'xyz'
>>> import sys
>>> sys.getrefcount(a)
3
>>> b = a
>>> sys.getrefcount(b)
4
>>> id(a)
88292288L
>>> id(b)
88292288L
이렇게 하면 인용 대상 이 가 변 대상 일 때(목록,사전,가 변 집합 등)예상 치 못 한 행동 을 할 수 있 습 니 다.

>>> a = [1, 2, 3, 4]
>>> b = a
>>> b.append(5)
>>> a
[1, 2, 3, 4, 5]
a 와 b 는 같은 대상 을 인용 하기 때문에 그 중 하 나 를 바 꾸 고 다른 하 나 는 이에 따라 달라 집 니 다.인용 이 아 닌 복사 본 을 만 들 려 면 대상 을 복사 할 수 있 습 니 다.
복사 대상 은 일반적으로 copy 모듈 을 사용 합 니 다:

>>> a = [1, 2, 3, 4]
>>> import copy
>>> b = copy.copy(a)
>>> b.append(5)
>>> b
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4]
이렇게 하면 됩 니 다.그러나 이런 복 제 는 얕 은 복사 입 니 다.복 제 된 새로운 대상 에는 원본 대상 의 항목 에 대한 인용 이 포함 되 어 있 습 니 다.대상 의 항목 이 가 변 대상 이 라면 통제 할 수 없 는 행위 가 발생 할 수 있 습 니 다.

>>> a = [1, [1, 2]]
>>> b = copy.copy(a)
>>> b[1].append(3)
>>> b
[1, [1, 2, 3]]
>>> a
[1, [1, 2, 3]]
이 럴 때 는 심 복 사 를 사용 해 야 한다.심 복 사 는 새 대상 을 만 들 고 포 함 된 모든 대상 을 재 귀적 으로 복사 합 니 다.

>>> a = [1, [1, 2]]
>>> b = copy.deepcopy(a)
>>> b[1].append(3)
>>> b
[1, [1, 2, 3]]
>>> a
[1, [1, 2]]
변경 할 수 없 는 대상 에 게(문자열,숫자,원본)등 은 복사 할 필요 가 없습니다.변경 할 수 없 기 때문에 무심코 변경 할 염려 는 없습니다.복사 작업 도 원래 대상 만 얻 을 수 있 습 니 다:

>>> a = (1, 2, 3)
>>> b = copy.copy(a)
>>> a is b
True
가 변 대상(목록,사전,가 변 집합)에 대해 서 는 내 장 된 함수 list(),dict(),set()를 각각 사용 하여 얕 은 복 제 를 할 수 있 으 며,속 도 는 copy 모듈 을 사용 하 는 것 보다 빠르다.
목록 도 절편 으로 얕 은 복 사 를 할 수 있 습 니 다:

>>> a = [1, 2, 3, 4]
>>> b = a[:]
>>> a is b
False
>>> b
[1, 2, 3, 4]
시퀀스 데이터 형식(문자열,목록,원본)을*작업 할 때 도 대상 항목 의 참조 만 복사 합 니 다.*를 사용 하면 다 차원 목록 을 만 듭 니 다.

>>> a = [1, 2, 3]
>>> b = [a]
>>> c = b * 3
>>> a.append(4)
>>> c
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
가장 좋 은 것 은 목록 유도 에서 얕 은 복 사 를 사용 하여 다 차원 목록 을 만 드 는 것 입 니 다.암시 적 인 참조 공 유 를 피 할 수 있 습 니 다.

>>> a = [1, 2, 3]
>>> c = [list(a) for i in range(3)]
>>> a.append(4)
>>> c
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
총결산
이상 은 Python 의 대상 에 대한 인용 과 예시 의 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.

좋은 웹페이지 즐겨찾기