Python/자료형과 기본 문법

Python 얕은 복사(주소 치환), 깊은 복사(deepcopy)

Yonggyu 2023. 9. 15. 10:38
반응형

 

복사(copy)는 객체의 주소를 지환하는 방법이라하고 그 방법에는 2가지 얕은복사, 깊은복사 가 있다.

얕은복사(주소 치환)는 서로 다른 변수이지만 같은 객체의 주소를 복사하는것을 말한다.

 

list1 = [1,2,3,4,5]
list2=list1 # 복사 list2=list1[:]도 가능
print(id(list1))
print(id(list2))

'''
결과값
[1, 2, 3, 4, 5]
2665749423488
2665749423488
'''

 

위의 를 보면 list1 과 list2가 같은 주소임을 알 수 있다. 즉 list1 = list2 은 객체의 주소를 복사하므로 새로운 객체가 만들어지는 것이 아닌 같은 객체를 참조하게된다 이를 '앝은 복사'라고 한다.

 

list1과 list2는 같은 주소값을 같기때문에 내용을 바꾸더라도 같은 값을 같게된다

list1 = [1,2,3,4,5]
list2=list1
print(list2)
print(id(list1))
print(id(list2))

list1[0]= 0 # list1의 0번째 index를 0으로 변경
print(list1)
print(list2)

"""
결과값
[1, 2, 3, 4, 5]
2665749745408
2665749745408
[0, 2, 3, 4, 5]
[0, 2, 3, 4, 5]
"""

위의 결과로 알 수 있듯이 list1만 바꿨음에도 list2까지 바뀐다.

그렇다면 서로 다른 객체를 가르키는 복사방법은없을까? 그것이 '깊은복사' 이다. 

 

깊은복사(deepcopy)는 deepcopy함수를 사용해야한다. 허나 deepcopy함수를 사용하려면 함수를 지원하는 모듈을 import해야 한다.

'''
import copy           # 모듈 로딩
list1 = [1,2,3,4,5]
list2= copy.deepcopy(list1)
print(list2)
print(id(list1))
print(id(list2))

list1[0]= 0
print(list1)
print(list2)
'''
결과값
[1, 2, 3, 4, 5]
2665749690048
2665749747520
[0, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
'''

copy.deepcopy(list1)을 하면 새로운 객체가 생성되고 list2는 새로운 객체의 주소를 참조하게된다.

위에 결과를 보면 list1 과 list2의 주소가 다르다. 주소가 달라 얕은복사와는 달리 list1[0]을 변경해도 list2는 바뀌지 않는다.

 

 

 

 

 

 

 

728x90
반응형