궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "파이썬 얕은 복사와 깊은 복사 개념 정리"입니다.

아래 영상 내용을 참조하여 정리하였습니다.

 

얕은복사 깊은복사 강의

 

1. 파이썬에서 변수 할당은 값을 복사하는 것이 아니라, 참조값을 복사하는 것이다.

파이썬 리스트의 할당 복사

 

위와 같이 변수 b에 리스트 [1,2,3]을 가리키는 a를 할당해주면 b에는 a의 값이 복사되는 것이 아니라, 리스트 객체를 가리키는 주소 값이 저장됩니다. 따라서 a, b 모두 [1,2,3]이라는 리스트 객체를 가리키는 상태가 됩니다.

C언어에서의 포인터라고 생각하면 되겠네요. 따라서 id 값을 보면 같은 값을 가리키게 됩니다.

 

append의 경우

따라서 a이든 b이든 append 메서드를 통해 값을 리스트에 추가하게 되면, a를 print 하든 b를 print 하든 모두 값이 추가된 리스트를 보게 됩니다. a, b는 같은 리스트 객체를 가리키고 있으니 당연한 결과이겠죠.

 

2. 얕은 복사

얕은복사

위와 같이 b 변수에 a [:] 리스트 전체를 인덱싱 한 값을 할당하면 어떻게 될까요? 그럼 흔히 얕은 복사라고 하는 복사가 이루어집니다.  이경우는 a와 b의 id 값은 각각 다릅니다. 또한, b에 append를 하면 a, b 두 리스트에 값이 추가되는 것이 아니라, 하나의 리스트에만 값이 추가됩니다.

 

def min_max2(lst) :
    lst.sort()
    print(lst[0], lst[-1], sep=', ')

l = [3,1,5,4]

min_max2(l)
print(l)


def min_max(lst) :
    lst = list(lst)
    # lst = lst.copy()
    lst.sort()
    print(lst[0], lst[-1], sep=', ')

l = [3,1,5,4]

min_max(l)
print(l)

 

위를 보면 min_max2 함수는  하나는 매개 값으로 받은 리스트를 그대로 sort() 매소드로 정렬해주었고, 

min_max 함수는 매개값으로 받은 리스트를 list 함수를 통해 새로운 리스트를 만들어서 정렬해주었습니다.

 

결과

결과를 보면 위에는 원본이 정렬되어 변경된 것을 볼 수 있고, 아래는 그렇지 않죠

 

얕은 복사 개념

 

3. 깊은 복사

깊은복사
깊은복사2

깊은 복사는 copy 모듈을 import 해서 deepcopy 메서드를 이용하는 것으로, 복사한 모든 값이 참조값이 각각 있다. 따라서 index로 값을 변경하더라도 deepcopy로 만든 b값이 같은 인덱스 값은 여전히 같은 값을 유지하는 것을 볼 수 있다.

 

import copy
r1 = ['John', ('man', 'USA'), [175,23]]
r2 = copy.deepcopy(r1)


r1[2][1] +=1

print(r1)
print(r2)

결과
참조에 대한 재귀적 복사

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading