2-3. 필수 문법 (copy)

uoayop·2021년 3월 14일
0

Leaf와 Python

목록 보기
7/21
post-thumbnail

각 프로그래밍마다 다른 구조를 가지고 있다. 파이썬에서 다루는 가변형/ 불변형 변수와 shallow copy, deep copy 의 차이점을 배워보자.

중요한 부분이고, 놓치기 쉽다. 실수하기 쉬우니까 집중 ~!

Copy

  • 오늘의 키워드
    • 일반 copy
    • Shallow copy, Deep copy

  • 파이썬에선 모든게 객체이다.

    1. 불변형 : int, float, string, unicode . . .
      한번 선언하면 값을 바꿀 수 없다.
    2. 가변형 : list, set, dictionary
      언제든 값을 바꿀 수 있다.
  • 객체의 복사 종류 : copy, shallow copy, deep copy

  • 복사를 할 때, 객체가 call by value / call by reference / call by share 중 어떤지 따져야 한다.


일반 copy

a_list = [1,2,3, [4,5]]
b_list = a_list

print('ex 1>', id(a_list), id(b_list))
# 서로 같은 아이디 값을 참조하고 있다.

b_list[2]= 100
print('ex 1>', a_list, b_list)

b_list[3][0]= 100
print('ex 1>', a_list, b_list)
# a_list의 값도 바뀌었다.
  • b_list는 a_list의 주소의 값을 참조하고 있다. 같은 곳을 가리키고 있는 것이다. ( Call by Reference )
    따라서 b_list의 값을 바꾸면 a_list의 값도 바뀐다.
  • 두 개의 변수 중 하나만 변경되어도 동일하게 수정되는 형상이 발생한다.
  • 이 현상을 해결하기 위해 Shallow copy와 Deep copy를 알아보자

Shallow copy : 얕은 복사

일반 copy와 다른 점

  • 복합 객체는 별도로 생성하지만, 그 안에 들어가는 내용은 같은 객체다.
  • 즉 복합 객체(껍데기)만 복사하고, 내용은 동일한 객체라는 뜻이다. 따라서 리스트 내부에 있는 리스트까지 복사가 되지 않는다.
  • 모듈을 import 해야 이용할 수 있다.
    import copy
import copy

c_list = [1, 2, 3, [4, 5]]
d_list = copy.copy(c_list)

print('ex 2> ',id(c_list),id(d_list))
# 서로 다른 아이디값을 가진다. 어떤 데이터의 원본을 백업해놓고 사용하면 좋다.

d_list[1] = 100
print('ex 2>', c_list, d_list)
# 복사본만 수정이 됐다.

d_list[3][0]= 100
print('ex 2>', c_list, d_list)
# 띠용~~~ 리스트 내부에 잇는 리스트를 수정했더니 원본 리스트가 변경 되었다.
  • 해당 가변형 객체 내부에 잇는 참조형 변수에 대해서 주소까지 다르게 복사해주지 않는다.
  • 따라서 리스트 안의 리스트는 같은 주소를 공유하고 있는 것이다. ( Call by Reference )

Deep copy : 깊은 복사

Shallow copy와 다른 점

  • 복합 객체(껍데기) 복사는 물론 그 내용도 재귀적으로 복사해준다.
e_list = [1, 2, 3, [4, 5]]
f_list = copy.deepcopy(e_list)
print('ex 3> ',id(e_list),id(f_list))
# 서로 다른 주소 값을 가진다.

f_list[1] = 100
print('ex 3>', e_list, f_list)
# 복사본만 수정이 됐다.

f_list[3][0]= 100
print('ex 3>', e_list, f_list)
# 복사본만 수정이 됐다.
  • 가변형 객체 내부에 있는 참조형 변수에 대해서도 주소를 다르게 복사해준다.
  • 따라서 내부적으로도 주소는 다르기 때문에 완전히 독립적으로 수정이 가능하다.

출처: 인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)

참고 : 얕은 복사(shallow copy) vs 깊은 복사(deep copy)

profile
slow and steady wins the race 🐢

0개의 댓글