파이썬에서는 데이터, 함수, 클래스, 모듈, 패키지 등을 모두 객체(object)로 취급한다. 객체는 자료형(data type)을 가지며 메모리를 차지한다. 파이썬의 이런 특징 때문에 파이썬의 변수는 값을 갖지 않는다는 특징이 있다.
Do it! 자료구조와 함께 배우는 알고리즘 -p.56 인용
즉, 어떤 변수에 값을 대입하면 변수는 그 값의 주소를 참조한다.
예를 들어 변수 a에 5를 대입해보자
a = 5
위 코드가 실행되면 5라는 int타입의 객체가 메모리에 할당된다. 그 후 메모리에 할당된 객체 주소를 a라는 변수가 가리킨다. 파이썬에선 이를 바인딩이라고 부른다.

이제부터 데이터 타입별 mutable여부를 구분해보고 각 객체별 변수 대입 시 차이점을 살펴보자.

참고) 파이썬에서 모든 값은 어떤 클래스의 인스턴스(객체) 이다.
먼저 immutable한 객체의 변수간 대입을 살펴보자
immutable한 객체는 대표적으로 str, tuple이 있으며 int, float등도 전부 수정불가한 객체이다.
>>> _str1 = 'abc'
>>> _str2 = _str1
>>> _str1
'abc'
>>> _str2
'abc'
>>>id(a)
4387454680
>>>id(b)
4387454680
_str2에 _str1을 할당하면 같은 메모리 주소를 가리키게 된다.
>>> _str2 = 'abcd'
>>> _str1
'abc'
>>> _str2
'abcd'
>>> id(a)
4387454680
>>> id(b)
4387454688
하지만 _str2에 다른 값을 할당하면 재할당이 이루어지며 서로 가리키는 메모리 주소가 변경된다.
그렇게 a와 b는 다른 값을 가진다.
다음은 mutable한 객체의 변수간 대입을 살펴보자
mutable한 객체는 대표적으로 list, dict 등이 있다..
>>> lst1 = [1, 2, 3]
>>> lst2 = lst1
>>> lst[0] = 5
>>> lst1
[5, 2, 3]
>>> lst2
[5, 2, 3]
>>> id(lst1)
4396179528
>>> id(lst2)
4396179528
immutable한 객체와 마찬가지로 lst2에 lst1을 할당하면 같은 메모리 주소 값을 갖는다.
하지만 lst2에 다른 값을 할당하면 lst1도 같이 바뀐다는 점은 다르다.
이런 현상은 다른 mutable한 객체에서 똑같이 나타난다.
그래서 immutable한 객체와 같이 복사본을 변경했을 때 원본 수정을 원치않는다면
>>> lst2 = lst1.copy()
위 코드처럼 copy()메서드를 사용하는 방법이 있다.
정리
immutable한 객체
_str1을 원본, _str2를 _str1의 복사본이라고 했을 때 복사본을 수정해도 원본이 수정되지 않는다.
immutable자료형은 직접 값이 변경되는 deep copy로 이해할 수 있다.
mutable한 객체
_lst1을 원본, _lst2를 _lst1의 복사본이라고 했을 때 복사본을 수정하면 원본이 수정된다.
mutable자료형은 shallow copy(내부적으로 포인터만 복사)가 적용된다.
mutable자료형에서 deep copy하기 위해선 object.copy() 등의 메서드를 사용하면 된다.
참고
https://goodthings4me.tistory.com/81
'Language > Python' 카테고리의 다른 글
| [Python] inconsistent use of tabs and spaces in indentation 에러 (0) | 2022.09.21 |
|---|---|
| Python bisect.bisect_left()와 bisect.bisect_right (0) | 2022.09.10 |
| [python] 파이썬 리스트의 슬라이싱 (0) | 2022.09.05 |
| [Python]파이썬 자료형별 시간복잡도 정리 (0) | 2022.09.03 |
| [python]파이썬 자료형의 참과 거짓 (0) | 2021.11.07 |