안녕세계

[Python] 단순복사 vs 얕은복사 vs 깊은복사 본문

[Python] 단순복사 vs 얕은복사 vs 깊은복사

Junhong Kim 2019. 1. 15. 23:50
728x90
반응형


파이썬에서 활용되는 복사 유형에 대해 알아봅니다.


단순복사

- 단순복사는 완전히 동일한 객체를 복사합니다.

a = [1, [2, 3, 4]]
b = a
# b는 a와 같은 객체 주소를 바라 봅니다.
print(b)
# [1, [2, 3, 4]]

b[0] = 100
b[1][0] = 100
print(a)
# [100, [100, 3, 4]]
print(b)
# [100, [100, 3, 4]]


* immutable 객체는 해당하지 않습니다.

- immutable 참조변수를 수정하는 것은 값을 바꾸는 것이 아니라 새로운 객체를 할당하는 것입니다.

a = 1
b = a
print(b)
# 1
b = 2
print(a)
# 1
print(b)


얕은복사(shallow copy)

# 방법1
b = copy.copy(a)
# 방법2
b = a[:]

- 복합객체([1, [2, 3, 4]])만 새로운 객체로 복사하고 내부객체([2, 3, 4])는 동일한 객체를 참조합니다.

- 객체를 복사하여 새로 구성하되 내부객체는 참조객체입니다. (즉, 복합객체만 새로운 객체입니다.)

- immutable 객체를 수정할 때는 복사본만 변경합니다.
- mutable 객체를 수정할 때는 원본과 복사본 둘 다 변경합니다.

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

b[0] = 100    # immutable object
b[1][0] = 100 # mutable object

print(a)
# [1, [100, 3, 4]]
print(b)
# [100, [100, 3, 4]]


깊은복사(deep copy)

b = copy.deepcopy(a)

- 내부객체([2, 3, 4]) 문제를 해결하기 위해 깊은복사를 사용합니다.

- 깊은복사는 복합객체와 내부객체를 재귀적으로 복사합니다.

- 둘 다 완전 다른 객체로 기존 객체의 값 변경에 영향 받지 않습니다. (즉, 객체 전체를 복사하여 새로운 객체를 만듭니다.)

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

b[0] = 100    # immutable object
b[1][0] = 100 # mutable object

print(a)
# [1, [2, 3, 4]]
print(b)
# [100, [100, 3, 4]]


※ 복사 방식이 두가지인 이유는?

1. 자기 자신을 참조하는 객체를 복사하면 recursive loop가 발생할 수 있기 때문입니다.

2. 깊은복사는 원본과 공유해야 하는 데이터까지 새로운 객체로 복사하기 때문입니다.


728x90
반응형

'Language > Python' 카테고리의 다른 글

[Python] iterator 와 generator  (0) 2019.01.17
[Python] switch 문 구현  (0) 2019.01.16
[Python] list에서 element 개수 세기  (0) 2019.01.14
[Python] list에서 dictionary 정렬  (0) 2019.01.13
[Python] list.sort()와 sorted(list) 차이  (1) 2019.01.12
Comments