Hello Computer Vision

할당과 복사(얕은 복사, 깊은 복사) 본문

딥러닝/파이썬

할당과 복사(얕은 복사, 깊은 복사)

지웅쓰 2023. 4. 1. 18:44

가끔씩 코드를 보면은 copy.copy / copy.deepcopy가 나와서 이전부터 궁금했었는데 이번에 한번 알아보려고 한다.

 

복사와 비슷한 개념인 할당을 한번 해보자.

a = [1,2,3,4]
b = a

print(b)

[1, 2, 3, 4]

리스트 a를 정의해주고 이를 b에 할당한 모습이다.

 

b[3] = 2
print(a)

[1, 2, 3, 2]

그리고 b의 원소를 바꾸고 a를 출력해보면 똑같이 a의 원소도 바뀐 것을 확인할 수 있다.

a[3] = 4
print(b)

[1, 2, 3, 4]

이는 반대로 a의 원소를 바꾸어도 b의 원소가 바뀐 것을 확인할 수 있는데 할당을 한다면 두 객체가 같은 주소를 쓰기 때문이다.

print(id(a))
print(id(b))

2435534720448
2435534720448

 

그렇다면 이제 본격적으로 복사를 알아보자.

 

import copy

a = [1,2,3,4]
b = copy.copy(a)

print(b)

[1, 2, 3, 4]

copy모듈을 활용하여 변수 a를 복사하였다.

a[3] = 1
print(b)

[1, 2, 3, 4]

그리고 a의 원소를 바꾼다면 할당과는 다르게 b의 원소는 바뀌지 않는다. 

 

여기서 리스트가 아닌 리스트안의 리스트를 한번 바꿔본다면?

a = [1,2,3, [4,5]]
b = copy.copy(a)

print(b)

[1, 2, 3, [4, 5]]
a[3].append(6)
print(b)

[1, 2, 3, [4, 5, 6]]

이렇게 append를 이용해 리스트 안의 리스트에 추가를 해주면 복사된 객체인 b도 변경되는 것을 확인할 수 있다.

a[3] = [4]
print(b)

[1, 2, 3, [4, 5, 6]]

그러나 append가 아닌 단순히 원소만 변경을 해주는 경우 변경되지 않는 것을 확인할 수 있다.

 

그렇다면 원래의 객체에 변경을 가해도 바뀌지 않는 객체를 만들고 싶다면 어떻게 할까? copy.deepcopy를 쓰면 된다.

a = [1,2,3, [4, 5]]
b = copy.deepcopy(a)

print(b)

[1, 2, 3, [4, 5]]
a[3].append(6)
print(b)

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

이렇게 append를 이용해 추가하여도 변경되지 않는 것을 확인할 수 있다.

 

결론: 복사를 할 경우 copy.copy를 쓴다면 원래의 객체에 의해 변경될 여지가 많으니 copy.deepcopy를 쓰자