땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • E
  • D
  • I

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원
Algorithm/concept

Python - 깊은 복사(Deep Copy)

Algorithm/concept

Python - 깊은 복사(Deep Copy)

2022. 1. 3. 20:09

*** BOJ 17488을 풀면서 리스트에 대한 변수 할당에 대해 의문을 가지면서 Deep Copy에 대해 공부해봤다.

Immutable(불변) vs Mutable(만변)

파이썬에서의 변수 개념은 저장공간을 할당 받지 않고 객체를 가리키는 포인터 개념이다

 

C언어에서는 int a = 1을 하면 a변수는 1의 값을 가지며 변수 a와 1은 같은 존재이다.

하지만 파이썬에서 a = 1은 a와 1은 별개의 존재이다.

a라는 변수는 Integer 1이라는 객체를 가리키고 있을뿐 변수에 정수 1의 값이 할당 된 것이 아니다.

Immutable : 숫자형(Number), 문자형(String), 튜플(Tuple)

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

Mutable : 리스트(list), 딕셔너리(Dictionary), 집합(set)

a = [1, 2, 3, 4]
b = a
print(a, b) # [1, 2, 3, 4] [1, 2, 3, 4]
b[1] = 0 # 배열 b의 두번째 값을 0으로 바꿔준다.
print(a, b) # [1, 0, 3, 4] [1, 0, 3, 4]

위에서 a와 b는 같은 주소값을 참조한다. list는 mutable하기 때문에 b의 값을 바뀌어 버리면 그 주소값에 있는 값을 바꾸어 버리기 때문에 같은 주소값을 참조하던 a도 값이 바뀌게 나온다.

 

Shallow Copy vs Deep Copy

Shallow Copy : 객체를 새로운 객체로 복사하지만 원본 객체의 주소값을 복사

Deep Copy : 전체 복사로 참조값의 복사가 아닌 참조된 객체 자체를 복사

 

Deep Copy를 위한 여러가지 방법

#copy모듈의 deepcopy() 이용
import copy

a = [1, 2, 3, 4]
b = copy.deepcopy(a)
b[1] = 0
print(a, b) # [1, 2, 3, 4] [1, 0, 3, 4]
#클래스가 가지고있는 copy()이용
#기본적인 클래스들이 가지고있는 copy()이용
#list 클래스 역시 copy() 가지고 있음
a = [1, 2, 3, 4]
b = a.copy()
b[1] = 0
print(a,b) # [1, 2, 3, 4] [1, 0, 3, 4]
#리스트 슬라이싱
a = [1, 2, 3, 4]
b = a[:]
b[1] = 0
print(a,b) # [1, 2, 3, 4] [1, 0, 3, 4]

각 방법 별로 처리속도가 다르니 이는 참고하는게 좋다.

처리속도는 리스트 슬라이싱이 가장 빠르고 copy 모듈의 deepcopy() 메소드가 가장 느리다고 한다.

리스트 슬라이싱이나 제네릭 copy의 copy() 메소드는 리스트가 오브젝트를 포함할 경우 그 오브젝트들은 얕은복사되는 것만 주의해서 사용하면 된다.

 

 

출처 : https://stackoverflow.com/questions/2612802/list-changes-unexpectedly-after-assignment-why-is-this-and-how-can-i-prevent-it

https://crackerjacks.tistory.com/14

 

'Algorithm > concept' 카테고리의 다른 글

코딩 테스트를 위한 기술 정리  (0) 2022.05.13
Coding Test(Priority Queue, Heap)  (0) 2022.04.30
Coding Test(최단 경로 알고리즘)  (0) 2021.12.17
Coding Test(다이나믹 프로그래밍)  (0) 2021.12.16
Coding Test(이진 탐색)  (0) 2021.12.16
  • Immutable(불변) vs Mutable(만변)
  • Shallow Copy vs Deep Copy
'Algorithm/concept' 카테고리의 다른 글
  • 코딩 테스트를 위한 기술 정리
  • Coding Test(Priority Queue, Heap)
  • Coding Test(최단 경로 알고리즘)
  • Coding Test(다이나믹 프로그래밍)
땅지원
땅지원
신입 개발자의 우당탕탕 기술 블로그

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.