얕은 복사본은 메모리를 재할당하여 새로운 개체를 만드는 것을 의미하지만, 그 안의 요소는 원래 개체의 각 하위 개체에 대한 참조입니다.데이터에 대해 얕은 카피 방식을 채택할 때, 만약 원래의 대상 중의 원소가 변할 수 없다면 상관없지만, 만약 원소가 가변적일 경우, 얕은 카피는 보통 약간의 문제가 생긴다. 예를 들면
list=[1,2,3]
copylist=list
list.pop(-1)
print(copylist)
출력[1, 2]
또한 사전의 경우 다음과 같은 경우가 있습니다
dict={"k":"v1"}
copydict=dict
dict["k"]="v2"
print(copydict)
출력 결과 {'k': 'v2'}
copylist의 요소는 list의 각 객체의 인용임을 알 수 있으며, list의 값을 변경하면 copylist의 값에 직접적인 영향을 미치므로 이는 엉터리이며, 우리는 이것을 원하지 않는 경우가 많습니다.
똑똑한 학생들은 이러한 상황이 얕은 복사본으로 인해 발생한다는 것을 알게 되었고, 직접 값을 할당하면 얕은 복사본이 나타납니다.
대부분의 시나리오에서 우리는 얕은 복사본이 나타나는 것을 원하지 않으며 깊은 복사본을 사용합니다.
이 예를 통해 얕은 카피를 사용하면 발생할 수 있는 부작용을 명확하게 볼 수 있습니다.이러한 부작용을 피하고 개체를 완전히 복사하려면 깊은 복사본을 사용해야 합니다.이른바 딥 카피는 메모리를 재할당하여 새 개체를 만들고 원래 개체의 요소를 재귀적으로 새 하위 개체를 생성하여 새 개체에 복사하는 것을 말합니다.따라서 새로운 개체는 원래 개체와 아무런 관련이 없습니다.
객체의 심층 카피는 Python에서 copy.deepcopy()로 구현됩니다.일단 카피백이 들어가야 되는데
1차원 list의 경우, 슬라이스 또는 딥 카피 API의 두 가지 방식으로 구현됩니다.
첫 번째 방법(슬라이스 구현):
list=[1,2,3]
copylist=list[:]
list.pop(-1)
print(copylist)
출력[1,2,3]
두 번째 copy 구현:
import copy
list=[1,2,3]
copylist=copy.deepcopy(list)
list.pop(-1)
print(copylist)
똑같이 출력하다[1,2,3]
여기서 블로거는 두 번째 copy.deepcopy 방법을 사용할 것을 제안하는데, 첫 번째는 2D list의 일부 경우에 대해 얕은 카피 문제가 발생할 수 있기 때문입니다.
사전의 경우
import copy
dict={"k":"v1"}
copydict=copy.deepcopy(dict)
dict["k"]="v2"
print(copydict)
출력 {'k': 'v1'}
Over
'개발 꿀팁 > PYTHON' 카테고리의 다른 글
파이썬 CSV 데이터 읽기 (0) | 2022.11.30 |
---|---|
pycharm 설치 pytorch (0) | 2022.11.30 |
파이썬 OJ 입출력 (0) | 2022.11.30 |
파이썬에서 eval 함수 (0) | 2022.11.29 |
Centos 설치 python (0) | 2022.11.29 |