티스토리 뷰

Python

Python,module copy [객체복사]

hwangyoungjae 2016. 4. 29. 13:10
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

copy모듈은 객체를 복사하기 위한 copy() deepcopy()함수를 제공한다.

python에서 list를 다른 변수에 할당하게 되면참조형태로 전달되기 때문에 실제로 같은 물리공간에 위치한 데이터를 가리키게 된다.

>>> a=['data']

>>> b=a #값을 복사하는것이 아닌 위치만 참조하는것

>>> id(a),id(b)

(14742032, 14742032)

>>> a is b

True

위처럼 a라는 list의 값을 b라는 리스트로 참조만 하게 되면 a라는 리스트의 값이 변경될경우 b리스트도 함께 변경된다

>>> a.append('add_data') #'a'리스트에만 값 추가

>>> a

['data', 'add_data']

>>> b

['data', 'add_data']

이처럼 참조하는 형태가 아닌 값을 복사하는 형태로 값을 가져오려면 copy모듈을 사용하면 된다.

copy모듈을 사용하여 값을 복사할때는 "얕은복사"와 "깊은복사", 두가지 방법이 있다.

얕은 복사는 상위리스트의 값만 복사하고 하위리스트는 참조형태로 할당하게 되며,

깊은 복사는 상위리스트와 하위리스트 모두 값을 복사하는 형태로 가져오게 된다.

>>> import copy

>>> List=['high',['low']]

>>> cp=copy.copy(List) #얕은복사

>>> dcp=copy.deepcopy(List) #깊은복사

>>> List

['high', ['low']]

>>> cp

['high', ['low']]

>>> dcp

['high', ['low']]

>>> id(List),id(cp),id(dcp) #상위리스트 ID

(14741792, 16728272, 16693688) #ID가 모두 다르다.

>>> id(List[1]),id(cp[1]),id(dcp[1]) #하위리스트 ID

(14743312, 14743312, 16693368) #dcp ID만 다르다.

 

상위리스트에 대만 id가 모두 다른것을 알수 있다

상위리스트의 값은 참조형태가 아닌 모두 복사형태로 값을 가져왔기 때문이다.

하지만 하위리스트의 경우

copy()함수를 사용했을때는 원본리스트와 같은 위치를 참조하게 된다.

deepcopy()함수는 하위리스트역시 복사형태로 값을 가져왓기 때문에 id가 원본리스트와 다른것을 알수 있다.

아래는 원본리스트의 하위리스트에 값을 추가한후 확인해본것이다.

>>> List[1].append('add_data')

>>> List

['high', ['low', 'add_data']]

>>> cp

['high', ['low', 'add_data']]

>>> dcp

['high', ['low']]

얕은복사한 "cp"리스트는 리스트의 위치를 참조하여 가져왔으므로 데이터가 보이지만 깊은복사를한 "dcp"리스트의 경우 값을 복사하여 가져왔기 때문에 원본리스트에 값을 추가하더라도 영향을 받지 않는다.

 

아래는 원본리스트의 상위리스트에 값을 추가한후 확인해본것이다.

>>> List.append('High_add_data')

>>> List

['high', ['low', 'add_data'], 'High_add_data']

>>> cp

['high', ['low', 'add_data']]

>>> dcp

['high', ['low']]

얕은복사와 깊은복사 모두 상위리스트의 경우는 값을 복사하여 가져왔으므로 원본리스트의 상위리스트에 값을 추가하더라도 복사한 리스트의 상위리스트는 영향을 받지 않는다.

 

a=b는 복사가 아닌 참조다. a b는 같은 영역을 바라보고 있기 때문에 a의 값을 변경하면 b의 값도 변경되고

b의 값을 변경하면 a의 값도 변경된다.

 

a=copy.copy(b)의 경우는 얕은복사다복사는 하되 한겹만 복사하는것이다원본리스트의 가장 상위의 리스트의 값만 복사되고 상위리스트에 포함되어있는 하위리스트의 값에 대해서는 참조형태로 값을 가져온다.

 

a=copy.deepcopy(b)의 경우는 깊은복사로서 상위리스트,하위리스트의 값을 모조리 다 복사하게 된다.

같은내용만 가지고 있는 새로운 객체를 생성한다고 보면 된다.

 

※ a=copy.copy(b) a=b[:]의 형태로 사용해도 될듯한다.

'Python' 카테고리의 다른 글

Python, 정적메소드,클래스메소드  (0) 2016.05.09
Python, @property  (0) 2016.05.09
Python,module re [정규표현식]  (0) 2016.04.29
Python, 예외처리  (0) 2016.04.29
Python, 파일 입출력  (0) 2016.04.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함