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 의 대상 에 대한 인용 과 예시 의 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.