반응형
복사(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
반응형
'Python > 자료형과 기본 문법' 카테고리의 다른 글
Python 딕셔너리(dictionary) 키, 값 가져오기 get(), keys(), values(), items() (2) | 2023.09.18 |
---|---|
Python 스택(Stack), 큐(Queue) (2) | 2023.09.15 |
Python list 함수 sort(), append(), extend(), insert(),append(), remove() (0) | 2023.09.14 |
Python 연산자 (0) | 2023.09.14 |