파이썬 학습의 copy and deepcopy

2281 단어

할당 작업


먼저 동일한 컨텐트의 두 객체를 살펴보겠습니다.
lst3 = list(range(4))
lst4 = list(range(4))
print(' ')
print(hash(id(lst3)))
print(hash(id(lst4)))
print(' =')
print(lst3==lst4)
print(' is')
print(lst3 is lst4)

결과:
 
4377943688
4377942472
 =
True
 is
False

그런 다음 지정을 사용합니다.
lst1 = lst3
print('1  is 3')
print(lst1 is lst3)
print(' ')
print(hash(id(lst1)))
print(hash(id(lst3)))
print(' 1 ')
lst1[2] = 99
print('1 3 :')
print(lst1)
print(lst3)
print('1  is 3')
print(lst1 is lst3)

결과:
1  is 3
True
 
4377943688
4377943688
 1 
1 3 :
[0, 1, 99, 3]
[0, 1, 99, 3]
1  is 3
True

그 결과 해시 값이 같은 대상만 is인 것으로 나타났다

얕은 복사


위 인쇄 작업을 함수 isequel로 봉하여 간단한 복사 대상의 앞뒤를 비교합니다.
lst3 = [1,[10,20],3]
print(' ')
lst4 = lst3.copy()
isequel(lst3,lst4)
print(' 3 ')
lst3[1][1] = 200
print('lst3=')
print(lst4)
print('lst4=')
print(lst4)
isequel(lst3,lst4)

결과:
 
 
4382428360
4382428104
 =
True
 is
False
 3 
lst3=
[1, [10, 200], 3]
lst4=
[1, [10, 200], 3]
 
4382428360
4382428104
 =
True
 is
False

얕게 복사한 후 두 대상은 is가 아니다. 하위 요소 중의 요소를 수정한 후에 변경을 따르면 주소만 복사한 것일 뿐이다.

딥 카피


copy 라이브러리 도입 필요
print('  import copy')
lst4 = copy.deepcopy(lst3)
isequel(lst3,lst4)
print(' 3 ')
lst3[1][1] = 300
print('lst3=')
print(lst3)
print('lst4=')
print(lst4)
isequel(lst3,lst4)

결실
  import copy
 
4515200136
4510722440
 =
True
 is
False
 3 
lst3=
[1, [10, 300], 3]
lst4=
[1, [10, 200], 3]
 
4515200136
4510722440
 =
False
 is
False

심층 복사는 사실 대상의 전체 구조를 복사하고 새로운 것을 만드는 것이기 때문에 네가 바꾸는 것은 나에게 영향을 주지 않는다.

= 딥 카피냐 얕은 카피냐.

print('= :')
lst5 = lst4
isequel(lst4,lst5)
lst4[1][1] = 400
print('lst4=')
print(lst4)
print('lst5=')
print(lst5)
isequel(lst5,lst4)

결실
= :
 
4390140616
4390140616
 =
True
 is
True
lst4=
[1, [10, 400], 3]
lst5=
[1, [10, 400], 3]
 
4390140616
4390140616
 =
True
 is
True

결과는'='가 얕은 복사라는 것을 증명했다.

좋은 웹페이지 즐겨찾기