Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[python] 얕은 복사 VS 깊은 복사 본문

프로그래밍/Python

[python] 얕은 복사 VS 깊은 복사

_Neo_ 2022. 1. 16. 15:30
반응형

얕은복사

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)
반응형
Comments