[TIL코테]mutable과 immutable

조민수·2022년 7월 29일

코테공부

목록 보기
7/13
post-thumbnail

2022-07-07

🚩자료를 복사하는 방법

사실 파이썬에서는 특정하게 우리가 자료를 명시하지 않기에 정확하게 자료형에 대한 파악이 모호할 때가 있다.그래두 자체적으로 저장되는 타입들이 있으니 먼저 정리를 해둘려고한다.

간단하게 생각해보자

변경이 가능한 객체=mutable 객체(list,set,dictionary)
변경이 가능 안되는 객체=immutable 객체(int,float,tuple,str,bool 등등)

복잡한거 다 떼고 정리를 하자면

mutable한 자료형은 각각 메모리를 생성해서 아무리 값이 같아도 다 다를 메모리를 참고한다

immutable한 자료형은 값이 같으면 거의 대부분 같은 메모리를 참고함

따라서 복사얘기로 다시 돌아오자면
immutable한 객체를 먼저 상황을 대보자면

	a=3
    b=a
    a=2

이와 같이 한다면 처음에는 b는 a를 참조하게 되는데 이 때 a값의 새로운 값을 할당하면 a는 2라는 메모리를 새롭게 참조하기에 a와 b는 엄연히 다른 값을 참조하게 된다

하지만

mutable한 객체인 리스트나 딕셔너리 set 같은 것에서 상황을 보면 달라진다

	arr1=[1,2,3]
    arr2=arr1
    arr1.append(4)

이와 같이 될경우 arr2는 arr1을 참조하게 되는데 이 때 arr1의 값이 바뀌면 자동적으로 arr2가 가리키는게 arr1이기에 arr2 또한 arr1이된다

즉 참조만 복사한 얕은 복사!

따라서 깊은복사,얕은복사 문제는 mutable한 타입에서의 문제이지 immutable은 의미가 없다

따라서 몇가지 방법이 존재한다

🔑[:]슬라이싱을 이용한 깊은복사처럼 보이는 얕은 복사

	arr1=[1,2,3]
    arr2=arr1[:]

이와 같이 하면 arr1과 arr2는 다른 메모리를 참조하게 된다.하지만 만약에 arr1에 내부에 리스트가 또 존재할시 체크해보면 그 안에 있는 리스트는 arr1과arr2 둘다 같은 주소를 참조하게 된다....
즉 이런면에서 약간 모호한 깊은복사(?),얕은복사(?)로 쓸수 있다.

🔑또는 copy.copy()를 사용가능

	import copy
    arr1=[1,2,3]
    arr2=copy.copy(arr1)

사실 이것또한 같은 얕은복사이다

출처:https://blockdmask.tistory.com/576

🔑copy.deepcopy()-깊은복사

	import copy
    arr1=[1,2,3]
    arr2=copy.deepcopy(arr1)

아예 새롭게 전체 새로운 메모리를 생성해준다

출처:https://blockdmask.tistory.com/576


🔑결론적으로 그냥 일반적인 자료형은

그냥 복사해서 쓰고

🔑리스트 같은 이런 자료형 때에만

특히 이중리스트를 안 가질 것 같으면 [:]슬라이싱으로 가볍게 써주는 게 좋을 듯 하다

profile
컬러감이 있는 프론트엔드개발자

0개의 댓글