>백엔드 개발 >파이썬 튜토리얼 >Python의 복사 모듈(얕은 복사 및 깊은 복사)에 대한 심층적인 이해

Python의 복사 모듈(얕은 복사 및 깊은 복사)에 대한 심층적인 이해

高洛峰
高洛峰원래의
2017-03-28 17:16:321897검색

파이썬에서는 복사 모듈을 주로 소개합니다.

복사 모듈에는 목록, 튜플, 사전 및 사용자 정의 개체의 인스턴스를 포함하여 복합 개체의 깊은 복사본과 얕은 복사본을 생성하는 기능이 포함되어 있습니다.

########

복사(x)

########

새 복합 객체를 생성하고 참조로 멤버를 복사하여 x의 얕은 복사본을 만듭니다. 더 깊게 말하자면

는 객체를 복사하지만 여전히 객체의 요소에 대한 참조를 사용합니다.

내장형의 경우 이 기능을 자주 사용하지 않습니다.

대신 list(x), dict(x), set(x) 등과 같은 호출 메서드를 사용하여 x의 얕은 복사본을 생성합니다.

을 직접 사용한다는 것을 알아야 합니다. 유형 이름은 확실히 copy()를 사용하는 것보다 낫습니다. 그러나 그들은 동일한 효과를 얻습니다.

또 다른 요점은 수정할 수 없는 객체(문자열, 숫자, 튜플)에 대한 것입니다. 수정에 대해 걱정할 필요가 없기 때문입니다. 복사 여부는

의미가 없습니다.

또 다른 점은 is 연산자를 사용하여 객체 복사 여부를 결정할 수 있다는 것입니다.

a는 b입니다 -> True a와 b는 복사본이 아니라 동일한 개체를 참조합니다.

- -> False a와 b는 서로의 복사본입니다.

예를 들어 예:

(1)

>>> = 복사 .copy(a)

>>> b

[1, 2, 3]

>>> )

>>>a

[1, 2, 3, 4]

>>>b

[1 , 2 , 3]

>>> a는 b입니다

거짓

(2)

>> [1 ,2,3]

>>> b = a

>>>b

[1, 2, 3]

>>>a.append(4)

>>>

[1, 2, 3, 4]

>>b

[1, 2, 3, 4]

>>b.append(6)

> >a,b

([1, 2, 3, 4, 6], [1, 2, 3, 4, 6])

(3)

> ;>> a = [1,2,3]

>> b = 목록(a)

>>b

[1, ​​2, 3]

>>> a.append(4)

>>> 2, 3, 4]

>>>b

[1, 2, 3]

>> (4)

>>> a = [[1], ['a'], ['A']]

>>> copy( a)

>>> 인쇄 a, b

[[1], ['a'], ['A']] [[1], [' a' ], ['A']]

>>> b[1].append('b')

>>> 🎜> [[1], ['a', 'b'], ['A']]

>>> ', 'b'], ['A']]

>>> b.append([100,101])

>>> 🎜> [[1], ['a', 'b'], ['A'], [100, 101]]

>>>a

[[ 1] , ['a', 'b'], ['A']]

예제 (3)에서는 a의 얕은 복사본 객체 b를 볼 수 있습니다. 객체

의 변경 사항은 서로 영향을 미치지 않지만 a와 b 객체의 요소는 동일한 객체를 참조하므로 a 또는 b가 해당 객체의 요소를 변경하면

에 영향을 미칩니다.

다른 것의 가치.

객체와 객체의 모든 요소의 값을 완전히 복사하려면 아래의 deepcopy() 함수만 사용하세요.

####################

deepcopy(x[, 방문])

# # ####################

새로운 복합 개체를 만들고 x의 모든 구성원을 반복적으로 복사하여 x의 전체 복사본을 만듭니다.

visit은 방문한 개체를 추적하여

을 정의하는 데이터 구조에서 반복되는 주기를 감지하고 방지하는 것이 목적인 선택적 사전입니다.

일반적으로 필요하지는 않지만

클래스는 __copy__(self) 및 __deepcopy__(self, Visit) 메서드를 구현하여 사용자 지정 복사 메서드를 구현할 수 있습니다. 각각 깊은 복사 작업.

__deepcopy__() 메서드는 복사 프로세스 중에 이전에 발견된 객체를 추적하는 데 사용되는 사전 방문을 사용해야 합니다.

__deepcopy__() 메서드의 경우

에서 구현에 포함된 다른 deepcopy() 메서드(있는 경우)에 방문을 전달하는 것 외에 다른 작업을 수행할 필요가 없습니다.

클래스가 피클 모듈에서 사용하는 __getstate__() 및 __setstate__() 메서드를 구현하는 경우 복사 모듈은

이러한 메서드를 사용하여 복사본을 생성합니다.

그러나 __copy__(self) 및 __deepcopy__(self, Visit) 메서드를 구현하면

클래스에서 사용자 정의 복사 메서드를 구현할 수 있습니다. 이 두 메서드는 각각 얕은 복사 작업과 전체 복사 작업을 구현합니다. .

__deepcopy__() 메서드는 복사 프로세스 중에 이전에 발견된 객체를 추적하는 데 사용되는 사전 방문을 사용해야 합니다.

__deepcopy__() 메서드의 경우

에서 구현에 포함된 다른 deepcopy() 메서드(있는 경우)에 방문을 전달하는 것 외에 다른 작업을 수행할 필요가 없습니다.

클래스가 피클 모듈에서 사용하는 __getstate__() 및 __setstate__() 메서드를 구현하는 경우 복사 모듈은

이러한 메서드를 사용하여 복사본을 생성합니다. , 그러나 __copy__(self) 및 __deepcopy__(self, Visit) 메서드를 구현하면

클래스에서 사용자 정의 복사 메서드를 구현할 수 있습니다. 이 두 메서드는 각각 얕은 복사 및 전체 복사 작업을 구현합니다.

__deepcopy__() 메서드는 복사 프로세스 중에 이전에 발견된 객체를 추적하는 데 사용되는 사전 방문을 사용해야 합니다.

__deepcopy__() 메서드의 경우 구현에 포함된 다른 deepcopy() 메서드(있는 경우)에 방문을 전달하는 것 외에

에서 추가 작업을 수행할 필요가 없습니다.

클래스가 피클 모듈에서 사용하는 __getstate__() 및 __setstate__() 메서드를 구현하는 경우 복사 모듈은

이러한 메서드를 사용하여 복사본을 생성합니다.

예:

>>> a = [[1], ['a'], ['A']]

>>> ; 복사 가져오기

>>> b = copy.deepcopy(a)

>>b

['a '], ['A']]

>>> c = copy.copy(a)

>>>c

[[ 1], ['a'], ['A']]

>>>a[1].append('b')

>>> a

[[1], ['a', 'b'], ['A']]

>>>b

[[1 ], ['a'], ['A']]

>>>c

[[1], ['a', 'b'], [' A']]

다음 사항에 유의해야 합니다.

(1) 복사 모듈은 정수 및 문자열과 같은 단순 유형에 사용되지만 거의 필요하지 않습니다.

(2) 이러한 복사 함수는 모듈, 클래스 객체, 함수, 메서드, 역추적, 스택 프레임, 파일, 소켓 및 기타 유사한 유형에서는 작동할 수 없습니다.

객체를 복사할 수 없으면 copy.error 예외가 발생합니다.

위 내용은 Python의 복사 모듈(얕은 복사 및 깊은 복사)에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.