Developer_Neo
[python] 얕은 복사 VS 깊은 복사 본문
반응형
얕은복사
mutable 자료형(리스트, 집합, 사전)의 copy() 메소드
copy모듈의 copy() 함수
깊은복사
copy모듈의 deepcopy() 함수
- 데이터 자체를 통째로 복사한다
- 복사된 두 객체는 완전히 독립적인 메모리를 차지한다.
얕은복사 -> copy함수를 안쓰고 = 기호를 썼을 때 , [:]슬라이싱 이용
>>> L = [3, 7, 20, 5]
>>> M = L # L, M은 객체를 공유
>>> id(L), id(M)
(1306075477120, 1306075477120)
>>> M[2] = 100
>>> print(L, M)
[3, 7, 100, 5] [3, 7, 100, 5]
>>> M=L[:]
>>> id(L), id(M)
(1306075477120, 1306075577728)
# 메모리 주소가 다르지만 얕은복사이다. 이유는 밑
>>> L = [3, 7, 20,[2,4,8], 5]
>>> M=L[:]
>>> id(L), id(M)
(1306073469952, 1306075553472)
>>> id(L[3]), id(M[3])
(1306075545856, 1306075545856)
'''
이것을 보면 리스트의 내부리스트
즉 리스트 안에 존재하는 리스트를 보면 메모리주소가 같아 동일한 곳을 가리키고 있는 것을 볼 수 있다.
이것으로 인해 얕은복사라고 하는 것이다.
'''
얕은복사 (copy() 메소드, copy모듈의 copy() 함수 )
>>> L = [3, 7, 20, 5]
>>> M = L.copy( ) # L, M은 다른 객체
>>> id(L), id(M)
(35599424, 35599784)
>>> M[2] = 100
>>> print(L, M)
[3, 7, 20, 5] [3, 7, 100, 5]
import copy
L1 = [1, 2, [3, 4]]
L2 = copy.copy(L1)
L2[2][0] = 100
print('L1 :', L1)
print('L2 :', L2)
여기에서도 마찬가지로 메모리주소가 다르지만 리스트안에 또 리스트가 있는 경우에는 얕은복사이기 떄문이다.
>>> L = [3, 7, 20,[2,4,8], 5]
>>> M=L.copy()
>>> id(L), id(M)
(1306073469952, 1306035510144)
>>> id(L[3]), id(M[3])
(1306075545856, 1306075545856)
깊은복사 ( copy.deepcopy(복사할 것) )
import copy
L1 = [1, 2, [3, 4]]
L2 = copy.deepcopy(L1)
L2[2][0] = 100
print('L1 :', L1)
print('L2 :', L2)
'''
L1 : [1, 2, [3, 4]]
L2 : [1, 2, [100, 4]]
'''
>>> import copy
>>> L = [3, 7, 20,[2,4,8], 5]
>>> M=copy.deepcopy(L)
>>> id(L), id(M)
(1306073469952, 1306075346688)
>>> id(L[3]), id(M[3])
(1306075545856, 1306075477120)
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[python] 함수 정의, main문 , 지역변수와 전역변수(global키워드) (0) | 2022.01.16 |
---|---|
[python] 사전 만들기, 연산자, 함수, 메소드 (0) | 2022.01.16 |
[python] 반복문 (while, for) (0) | 2022.01.16 |
[python] 집합 만들기, 연산자, 함수, 메소드 (0) | 2022.01.16 |
[python] 튜플 연산자, 함수, 메소드 (0) | 2022.01.16 |
Comments