> 백엔드 개발 > 파이썬 튜토리얼 > 자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사

자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사

WBOY
풀어 주다: 2023-04-12 11:37:05
앞으로
1806명이 탐색했습니다.

자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사

Python 인터뷰에서 얕은 복사와 깊은 복사는 상대적으로 어려운 질문입니다. 60%의 사람들은 얕은 복사와 깊은 복사에 대해 들어본 적이 없으며, 30%의 사람들은 둘 사이의 기본 개념과 간단한 차이점만 알고 있습니다. 성인 한 명 미만만이 둘 사이의 차이점을 정확하게 구분하고 관련 코드 데모 작성을 완료할 수 있습니다! 오늘은 이 어려움을 해결하고 면접에 승진에 무게를 더해보자! 이 글은 아마도 인터넷 전체에서 얕은 카피와 딥 카피를 설명하는 글 중 가장 이해하기 쉬운 글일 것입니다. 글에 나오는 예시와 실습을 따라해보시면, 얕은 카피와 딥 카피가 무엇인지에 대한 기술적인 어려움을 확실히 이해하실 수 있을 것입니다. 복사해!

변수 할당

파이썬 변수 데이터 유형(리스트, 딕셔너리, 세트)에서 변수 데이터 유형 변수를 다른 변수에 할당합니다. 두 변수는 동일한 객체를 참조하고 메모리 주소가 동일합니다. 예, 하나의 변수가 수정되면 다른 변수도 이에 따라 수정됩니다. Python의 변경 가능한 데이터 유형과 불변 데이터 유형에 대한 기술적인 세부 사항을 알고 싶다면 다음 기사를 읽어보세요.​​Python 인터뷰에서 자주 묻는 질문: 변경 가능한 데이터 유형과 불변 데이터 유형의 차이점. ​

이전 글의 예를 들어보겠습니다.

l1=['a','b','c']
l2=l1
print(id(l1))
print(id(l2))
l2.append('d')
print("************")
print(id(l1))
print(l1)
print(id(l2))
print(l2)
输出:
838366483528
838366483528
************
838366483528
['a', 'b', 'c', 'd']
838366483528
['a', 'b', 'c', 'd']
로그인 후 복사

여기에서는 출력 결과에 대해 설명하지 않습니다. l1과 l2의 주소는 동일하므로 서로 영향을 미칩니다.

Shallow copy

는 개체의 최상위 수준을 복사하고 개체의 "참조"만 복사합니다.

이전 기사의 예를 들어 보겠습니다. 목록에는 레이어가 하나만 있습니다. 즉, 요소에는 다른 목록이 포함되어 있지 않습니다.

l3=['x','y','z']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('a')
print(l3)
print(l4)
输出
831456302152
831480344136
['x', 'y', 'z']
['x', 'y', 'z', 'a']
로그인 후 복사

결과에서 볼 수 있듯이 l3과 l4의 주소가 다르기 때문에 서로 영향을 미치지 않습니다.

또 다른 예를 들어 l3의 첫 번째 요소를 목록으로 만들어 보겠습니다.

l3=[['x','y','z'],'a','b']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('c')
print(l3)
print(l4)
结果
533336249416
533337391240
[['x', 'y', 'z'], 'a', 'b']
[['x', 'y', 'z'], 'a', 'b', 'c']
로그인 후 복사

첫 번째 요소가 목록이므로 주소도 있고 인쇄하므로 결과는 정확히 예상한 대로입니다.

print(id(l3[0]))
print(id(l4[0]))
结果
533336248904
533336248904
로그인 후 복사

l3[0]과 l4[0]의 주소가 실제로 동일한 것을 확인하고, 다음 코드를 실행해보겠습니다.

l3[0].append('yy')
print(l3)
print(l4)
结果
[['x', 'y', 'z', 'yy'], 'a', 'b']
[['x', 'y', 'z', 'yy'], 'a', 'b', 'c']
로그인 후 복사

결과는 예상과 일치합니다. l3[0] 값을 수정하면 l4[0]에도 영향을 줍니다. 그렇다면 l3[0]과 l4[0]이 서로 영향을 미치는 것을 방지하려면 어떻게 해야 할까요? 이를 위해서는 전체 복사가 필요합니다.

Deep copy

Deep copy는 개체의 모든 레이어를 복사합니다. 복사된 개체는 원본 개체와 완전히 독립적이며 관계가 없습니다. Deep Copy를 구현하려면 Copy 모듈에서 DeepCopy 메서드를 사용해야 합니다.

import copy
l3=[['x','y','z'],'a','b']
#l4=list(l3) #浅拷贝,使用=copy.copy(l3)也可以实现浅拷贝
l4=copy.deepcopy(l3) #深拷贝
l4.append('c')
print(id(l3[0]))
print(id(l4[0]))
l3[0].append('yy')
print(l3)
print(l4)
输出
407168435784
407166887304
[['x', 'y', 'z', 'yy'], 'a', 'b']
[['x', 'y', 'z'], 'a', 'b', 'c']
로그인 후 복사

l3[0]과 l4[0]은 완전히 독립적이며 서로 영향을 미치지 않는다는 것을 알 수 있습니다.

얕은 복사와 깊은 복사의 요약

말할 것도 없고, 두 장의 그림으로 간단하게 설명해보세요.

아래와 같은 얕은 복사:

자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사

아래와 같은 깊은 복사:


자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사

위 내용은 자주 묻는 Python 인터뷰 질문: 얕은 복사와 깊은 복사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿