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

김민주·2024년 10월 25일

python copy, deepcopy

id값들은 다 달라용

얕은 복사

a =[5, 4, 3, 2, 1]
b = a.copy()
print(id(a), id(b)) #a, b의 id값
a.sort()
print(a)
print(b)
print(a)

136706586227072 136706586388480
[1, 2, 3, 4, 5][5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]

객체는 같은 값임

따라서 동일한 id 값을 갖게 된다
또한, 값을 변경하게 되면 참조하는 리스트의 값들도 변경되게됨


import copy

a = [[1, 2], [3, 4]]
b = a.copy()  # 얕은 복사
print(id(a), id(b))  # 서로 다른 id 출력

# 바깥 리스트의 id는 다르지만, 내부 리스트는 같은 객체를 참조
print(id(a[0]), id(b[0]))  # 동일한 id 출력 (내부 리스트는 같은 객체)
print(id(a[1]), id(b[1]))  # 동일한 id 출력

# a의 내부 리스트 변경
a[0][0] = 99

print(a)  # [[99, 2], [3, 4]]
print(b)  # [[99, 2], [3, 4]]  --> b도 영향을 받음

깊은 복사

import copy
a = [5, 4, 3, 2, 1]
b = copy.deepcopy(a) # 깊은 복사 참조값, 메모리값을 다르게 복사하는것들을 참조한다고 함
print(id(a), id(b))
a.sort()
print(a)
print(b)

136706601295296 136707210895872
[1, 2, 3, 4, 5][5, 4, 3, 2, 1]

여기까지는 얕은 복사와 비슷해보임

객체는 다른값이 됨

import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)  # 깊은 복사
print(id(a), id(b))  # 서로 다른 id 출력

# 바깥 리스트와 내부 리스트 모두 다른 객체로 복사됨
print(id(a[0]), id(b[0]))  # 다른 id 출력
print(id(a[1]), id(b[1]))  # 다른 id 출력

# a의 내부 리스트 변경
a[0][0] = 99

print(a)  # [[99, 2], [3, 4]]
print(b)  # [[1, 2], [3, 4]]  --> b는 영향을 받지 않음

136706588920768 136707209328192
136706586383040 136706586389504
136707209396096 136706586257664
[[99, 2], [3, 4]]
[[1, 2], [3, 4]]

profile
mingdue02

0개의 댓글