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

Hello World·2024년 9월 27일

PythonNotebook

목록 보기
5/13
post-thumbnail
  • 우리가 a_list 라는 새로운 리스트를 만들면 파이썬은 컴퓨터 메모리에 리스트를 저장한 후에, 리스트의 주소를 alist 변수에 저장한다.
  • 즉, a_list는 리스트의 모든 원소를 담고있는 것이 아니라, 리스트의 원 소들이 있는 곳의 저장 위치 만을 가지고 있는 것이다.
  • a_list가 리스트 객체를 참조한다(reference)는 표현을 사용한다.

얕은 복사

a_list = ['Kim', 'Park', 'Lee', 'Hong']
b_list = alist  # 얕은 복사

b_list[1] = 'Choi'  # b_list의 두번째 요소 변경

print(a_list)  # ['Kim', 'Choi', 'Lee', 'Hong']
print(b_list)  # ['Kim', 'Choi', 'Lee', 'Hong']

print(id(a_list))  # 2354501630272
print(id(b_list))  # 2354501630272
  • id() 함수를 통해서 메모리에 올라온 객체의 고유한 식별번호를 알아 낼 수 있다.
  • 이를 통해 alist와 blist의 아이디를 조회해보면 두 객체의 아이디가 같다는 것을 알 수 있다. (= 두 변수는 같은 리스트 객체를 참조한다.)
  • 따라서 복사한 리스트의 값을 변경하면 원본 리스트의 값도 같이 변경된다. (같은 주소를 참조하고 있기 때문에)
  • 이것을 얕은 복사라고 한다.

깊은 복사 (리스트를 복제하여 새로운 리스트 만들기)

a_list = ['Kim', 'Park', 'Lee', 'Hong']
b_list = list(a_list)  # OR a_list[:] OR a_list.copy()

print(id(a_list))  # 2354501014656
print(id(b_list))  # 2354493320512

b_list[1] = 'Choi'  # b_list의 두번째 요소 변경

print(b_list)  # ['Kim', 'Choi', 'Lee', 'Hong']
print(a_list)  # ['Kim', 'Park', 'Lee', 'Hong']
  • 만약 동일한 내용을 가지는 새로운 리스트를 생성하고 싶은 경우: list(), slicing
  • 그렇게 하면 원래 리스트의 복사본이 생성되며 b_list 이 복사본을 참조한다.
  • 따라서 두 객체의 id는 다른 값을 가진다.
  • 이것을 깊은 복사라고 한다.

0개의 댓글