프로그램에서 개체를 복사해야 하는 경우가 종종 있습니다.
a = [1, 2, 3] b = a # [1, 2, 3] print b
복사되었으나 이제 첫 번째 요소의 값을 5로 변경해야 합니다
b[0] = 5 # [5, 2, 3] print b # [5, 2, 3] print a
b의 첫 번째 요소 값을 변경했는데 a의 값도 변경되었습니다. 이는 Python에서 =가 a와 b가 동일한 목록을 가리키기 때문에 목록을 변경하면 위와 같은 결과가 발생하기 때문입니다. .
해결책은 슬라이싱입니다
a = [1, 2, 3] b = a[:] b[0] = 4 # [1, 2, 3] # [4, 2, 3] print a print b
하지만 중첩 목록의 경우에는 시도해 보세요
a = [[1,2,3], 4, 5] b = a[:] b[1] = 0 # [[1,2,3], 4, 5] # [[1,2,3], 0, 5] print a print b
그렇습니다! 문제 없습니다. 중첩된 목록 요소를 사용해 보겠습니다
a = [[1,2,3], 4, 5] b = a[:] b[0][0] = 5 # [[5,2,3], 4, 5] # [[5,2,3], 4, 5] print a print b b = a[:]
스틸 복사의 값은 개체만 복사하고 하위 요소는 복사하지 않습니다.
복사 모듈
복사 모듈은 개체를 복사하는 데 사용됩니다. 이 모듈은 매우 간단하며 각각 얕은 복사와 전체 복사를 나타내는 copy.copy 및 copy.deepcopy라는 두 가지 주요 메서드만 제공합니다. 얕은 복사(shallow copy)와 깊은 복사(deep copy)는 무엇입니까? 인터넷에는 엄청난 양의 정보가 있으므로 여기서는 자세히 설명하지 않겠습니다. 복사 작업은 복합 개체에서만 작동합니다. 간단한 예를 사용하여 이 두 가지 방법을 각각 소개합니다.
얕은 복사는 개체 자체만 복사하며 개체가 참조하는 개체는 복사하지 않습니다.
#coding=gbk import copy l1 = [1, 2, [3, 4]] l2 = copy.copy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
결과:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]] [1, 2, [50, 4]]
같은 코드라도 전체 복사를 사용하면 결과가 다릅니다:
import copy l1 = [1, 2, [3, 4]] l2 = copy.deepcopy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
결과:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]]
복사 기본 동작 변경
클래스를 정의할 때 __copy__ 및 __deepcopy__ 메서드를 정의하여 복사의 기본 동작을 변경할 수 있습니다. 다음은 간단한 예입니다.
class CopyObj(object): def __repr__(self): return "CopyObj" def __copy__(self): return "Hello" obj = CopyObj() obj1 = copy.copy(obj) print obj print obj1
결과:
CopyObj Hello