이 글은 여러분이 파이썬에서 할당과 복사에 대한 지식을 이해할 수 있도록 안내하는 글을 공유할 것입니다. 관심 있는 친구들은 함께 살펴보세요
변수와 할당
파이썬에서는 모든 것이 객체와 객체는 ""변수 이름" 참조를 전달합니다. "변수 이름"은 "이름"이라고 더 정확하게 불립니다. 마치 우리 각자가 자신의 이름을 갖고 있는 것처럼 우리는 사람을 이름으로 참조하고 객체는 다음으로 참조합니다. 코드에 이름을 입력하세요.
변수 할당은 개체에 이름을 바인딩하는 것입니다. 우리가 태어날 때 부모님이 우리에게 이름을 지어주듯이, 누군가에게 별명을 지어준다고 해서 사람이 늘어나는 것이 아니라, 이름이 늘어나는 것뿐입니다.
두 객체를 비교하는 방법에는 is와 ==가 있습니다. is는 두 객체가 동일한지 비교합니다. ==는 두 객체의 ID 값을 통해 식별할 수 있습니다. 값이 같은가요
>>> x1 = [1,2] >>> x2 = [1,2] >>> x1 is x2 False >>> id(x1) 4338854088 >>> id(x2) 4338904392 >>> x1 == x2 True
x1과 x2의 값은 동일하지만 두 개의 동일한 객체처럼 메모리에서 서로 다른 메모리 공간을 차지하는 두 개의 독립적이고 다른 개체입니다. 테이블 위에 놓인 사과는 실제로 두 개의 다른 물체입니다.
>>> x3 = x2 >>> x3 is x2 True >>> id(x3) 4338904392
앞서 언급했듯이 할당은 개체에 이름을 바인딩하는 것입니다. 여기서는 x3이라는 개체에 새 이름을 바인딩합니다. x2라는 라벨이 붙었고 나중에는 x3이라는 라벨이 붙었습니다. 본질적으로 동일한 사과이므로 x2와 x3은 실제로 동일한 개체를 참조합니다.
x2를 통해 개체를 수정하면 본질적으로 동일한 개체이기 때문에 x3도 그에 따라 변경됩니다. 이는 Zhang San과 Xiao Zhang이 같은 사람일 때 실제로 Zhang San에 옷을 추가하는 것과 같습니다. Xiao Zhang의 옷.
>>> x2.append(3) >>> x2 [1, 2, 3] >>> x3 [1, 2, 3]
그러나 x2를 다시 할당하면 x2는 더 이상 이전 개체를 참조하지 않고 새 개체를 참조하고 x3은 여전히 이전 개체를 참조한다는 의미입니다. 예를 들어 테이블 위의 큰 사과에는 x2와 x3라는 두 개의 레이블이 있습니다. x2에 값을 다시 할당하는 것은 x2 레이블을 다른 사과에 연결하는 것과 동일하지만 x3은 여전히 이전 사과에 연결되어 있습니다.
>>> x2 = [3, 4] >>> x3 [1, 2, 3]
객체 복사
때로는 비즈니스에서 객체를 복사해야 하지만 원본 객체에 부작용이 발생하고 싶지는 않습니다. 확실히 할당으로는 해결할 수 없습니다. 새 변수에 대한 값(객체 복사가 아닌 할당)으로 인해 Python은 원래 객체를 기반으로 동일한 값을 포함하는 객체를 빠르게 생성할 수 있는 복사 메커니즘을 특별히 제공합니다. 이 기능은 복사 모듈에서 제공됩니다.
복사는 얕은 카피와 깊은 카피로 구분됩니다.
>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3] >>> sdc = copy.deepcopy(s) # 深拷贝 >>> sdc [1, 2, 3]
복사된 개체는 동일한 값만 가질 뿐 실제로는 다른 개체입니다
>>> s == sc == sdc True >>> s is sc False >>> s is sdc False
그럼 얕은 복사와 깊은 복사의 차이점은 무엇인가요?
정수, 문자열, 튜플 등의 불변 객체와 이러한 불변 객체로 구성된 컬렉션 객체의 경우 얕은 복사와 심층 복사 모두 차이가 없습니다.
둘의 차이점은 복사할 때입니다. 목록 내의 목록, 사전 또는 사전 내의 목록과 같은 객체 결합은 외부 셸만 복사하고 내부 요소는 복사되지 않는 반면, 깊은 복사는 셸과 내부 요소를 결합하여 새로운 복사본이 만들어졌습니다.
예제를 살펴보겠습니다.
>>> x = [2, 3] >>> y = [7, 11] >>> z = [x, y] >>> a = copy.copy(z) # 浅拷贝 >>> a[0] is z[0] True
복사된 객체 a의 요소는 x와 y를 참조하며, x 값을 수정하면 a도 그에 따라 변경됩니다.
>>> b = copy.deepcopy(z) # 深拷贝 >>> b[0] is z[0] False
딥 카피의 경우 내부 요소도 다시 복사되며, x, y 값이 같은 두 요소가 복사되어 x, y 값을 수정해도 b 영향은 없습니다.
목록 z[:]의 조각을 복사하거나 객체의 복사 메서드 list.copy()를 호출하는 것은 모두 얕은 복사본입니다. 사용자 정의 개체의 경우 __copy__ 메서드와 __deepcopy__ 메서드를 직접 구현할 수도 있습니다
관련 권장 사항:
위 내용은 Python 할당 및 복사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!