중화사전망 - 서예자전 - 파이썬 객체의 사본

파이썬 객체의 사본

파이썬 할당 작업 또는 함수 매개 변수 전달은 항상 객체 내용이 아닌 객체 참조 (메모리 주소) 를 전달합니다. 파이썬의 모든 것은 객체이며, 객체는 소프트 유형과 하드 유형으로 나눌 수 있습니다. 객체 복사는 메모리에 새 객체를 만들고 새 메모리 주소를 생성하는 것을 의미합니다. 최상위 객체와 해당 하위 객체가 모두 불변의 불변인 경우 새 객체가 생성되지 않았기 때문에 복사본이 없습니다. 단순 복사, 최상위 수준 오브젝트 복사, 내부 하위 오브젝트 복사 안 함. 깊이 복사-최상위 객체와 내부 하위 요소 객체를 재귀적으로 복사합니다.

파이썬 안의 모든 것이 대상이고, 개체는 데이터가 들어 있는 플라스틱 상자와 같다. Boolean 및 Integer 와 같은 다양한 유형의 객체가 있으며 유형에 따라 사용할 수 있는 작업이 결정됩니다. 실생활에서 "도기" 는 몇 가지 정보를 암시한다. 예를 들어 무겁고 연약할 수 있으므로 땅에 떨어지지 않도록 조심해야 한다.

객체 유형에 따라 포함된 데이터가 수정 가능한 변수 (변수) 인지 수정할 수 없는 상수 (불변) 인지 결정됩니다. 변하지 않는 개체를 투명하지만 닫힌 상자로 생각할 수 있습니다. 안에 있는 데이터를 볼 수는 있지만 변경할 수는 없습니다. 마찬가지로 가변 오브젝트는 열린 상자와 같습니다. 안에 있는 데이터를 볼 수 있을 뿐만 아니라 꺼내서 수정할 수도 있지만 상자 자체를 변경할 수는 없습니다. 즉, 객체 유형을 변경할 수 없습니다.

객체 복사는 메모리에 새 객체를 만들고 새 메모리 주소를 생성하는 것을 의미합니다.

단순 복사, 최상위 수준 오브젝트 복사, 내부 하위 오브젝트 복사 안 함.

2.1..1.최상위 레벨은 가변적이고 하위 요소는 불변입니다.

최상위 객체가 변수이지만 하위 요소 객체는 변경되지 않는 경우 (예: [1, world, 2])

① 목록 객체를 만들어 변수 a 에 할당합니다

② 복사 모듈을 가져오고 copy.copy () 함수를 사용하여 a 를 부드럽게 복사하여 변수 b 에 할당합니다.

③ 변수 a [0] = 3 의 하위 요소 a [0] 을 수정합니다. 정수는 불변의 객체이므로 1 을 3 으로 수정하는 대신 a [0] 을 객체 3 을 가리키도록 변경합니다.

최상위 개체가 가변이지만 하위 요소에도 가변 개체가 있는 경우 (예: [1, 2, [hello, world]]

(1)shallow copy. copy () 는 최상위 오브젝트만 복사하고 하위 요소 오브젝트 [hello, world] 는 복사하지 않습니다. 즉 a [2] 와 b [2] 는 같은 목록을 가리킵니다

② a [2] [1] =' 중국' 을 수정한 다음 b [2] [1] =' 중국' 을 수정합니다

최상위 객체가 불변이고 모든 하위 요소 객체가 불변인 경우 (1, 2,3).

변수 a 와 변수 b 는 같은 튜플 객체를 가리키며 복사되지 않습니다.

최상위 객체가 변경되지 않지만 하위 요소에 가변 객체가 있는 경우 (예: 1, 2, [hello, world])

변수 a 와 변수 b 는 같은 튜플 객체를 가리키고, a [2] 와 b [2] 는 같은 목록을 가리키므로 a [2] [1] 를 수정하면 b [2] [1] 에 영향을 줍니다

깊이 복사-최상위 객체와 내부 하위 요소 객체를 재귀적으로 복사합니다.

최상위 객체가 변수이지만 하위 요소 객체는 변경되지 않는 경우 (예: [1, world, 2])

변수 a 와 변수 b 는 서로 다른 목록 객체를 가리킵니다. A [0] 을 수정하면 목록 a 의 첫 번째 요소만 새 오브젝트를 가리키게 되고 b [0] 에는 영향을 주지 않습니다.

최상위 개체가 가변이지만 하위 요소에도 가변 개체가 있는 경우 (예: [1, 2, [hello, world]]

깊이 복사는 최상위 수준 오브젝트뿐만 아니라 하위 요소 오브젝트도 재귀적으로 복사하므로 A [2] 와 B [2] 는 서로 다른 두 목록 객체를 가리키지만 목록 객체의 하위 요소는 처음에 동일한 문자열 객체를 지정합니다. [2] [1] =' China' 를 수정한 후 새 문자열 객체 (메모리 주소는 1400) 를 다시 가리킵니다

최상위 객체가 불변이고 모든 하위 요소 객체가 불변인 경우 (1, 2,3).

변수 a 와 변수 b 는 동일한 튜플 객체를 가리키며 복사본이 없습니다.

최상위 객체가 변경되지 않지만 하위 요소에 가변 객체가 있는 경우 (예: 1, 2, [hello, world])

변수 a 와 b 는 서로 다른 튜플 개체를 가리키고, a [2] 와 b [2] 는 서로 다른 목록 개체를 가리키므로 a [2] [1] 를 수정해도 b [2] [1] 에는 영향을 주지 않습니다.

= is 를 사용하여 값을 지정합니다. 즉, 목록 객체에 대한 참조를 변수 B 에 할당합니다. 목록 객체를 상자로 생각할 수 있습니다. 변수 A 는 상자의 레이블과 같습니다. B = a 를 수행하면 b 로 상자를 표시하는 것과 같고 a 와 b 는 실제로 같은 오브젝트를 가리킵니다. 따라서 A 또는 B 를 통해 목록의 내용을 수정하든 결과는 양 당사자에게 영향을 미칩니다.

B/c/d 는 모두 a 의 복사본으로, 모두 다른 목록 객체를 가리키지만 복사된 하위 요소는 없습니다. A [2] 와 B [2]/C [2]/D [2] 는 같은 목록을 가리키며 얕은 복사본의 효과와 맞먹는다.

슬라이스 [:] 작업을 사용하면 A 와 B 가 실제로 같은 튜플을 가리키고 하위 요소를 복제하지 않고 A [2] 와 B [2] 도 같은 목록을 가리키는데, 이는 얕은 복제의 효과와 맞먹는다.

목록과 마찬가지로 사전의 copy () 함수 또는 변환 함수 dict () 를 사용할 수 있습니다.

변수 a 와 변수 b/c 는 다른 사전을 가리키지만 하위 요소는 복사되지 않습니다. A ['jobs'] 와 b ['jobs']/c ['jobs'] 는 같은 목록을 지정했는데, 이는 얕은 층 복제의 효과와 맞먹는다.

목록과 마찬가지로 set 의 copy () 함수 또는 변환 함수 set () 를 사용할 수 있습니다.

변수 A 와 변수 b/c 는 서로 다른 컬렉션을 가리키고 컬렉션의 요소는 해시가 가능해야 하므로 컬렉션 A 를 수정해도 B/C 에 영향을 주지 않습니다.