immutable & mutable
Immutable
: 수정 불가능한 객체
- 대표적인 객체 : 튜플, 문자열
mutable
: 수정 가능한 객체- 대표적인 객체 : 리스트, 딕셔너리
r = [1, 2] id(r) > 51637384 r += [3, 4] r > [1, 2, 3 ,4] id(r) > 51637384
리스트객체와 튜플객체의 주소 정보를 확인해보면,
리스트 객체는 추가 연산을 했을경우 동일한 주소 정보를 가지게 되나,t = (1, 2) id(t) 58040192 t += (3, 4) t > (1, 2, 3, 4) id(t) > 53173968
튜플 객체는 추가 연산을 했을경우 실행 결과는 동일해 보이나, 수정이 불가한 객체이므로 새로운 튜플이 만들어져 변경된 주소 정보를 가지는것을 확인 할 수 있다.
기존의 t = (1, 2) 는 R.c = 0 이 되므로, 가비지 컬렉션 대상이다.
성격에 따라 달라지는 함수의 정의
[리스트]
def add_last(m, n): m += n
r = [1, 2] add_last(r, [3, 4] r > [1, 2, 3, 4]
mutable 한 리스트 예제의 경우 함수가 리스트를 대상으로 잘 동작하는것을 확인할 수 있다.
(튜플)
t = (1, 3) add_last(t, (5, 7)) t > (1, 3)
immutable 한 튜플의 경우 함수가 리스트를 대상으로 동작하지 않는다.
= 연산부분인 m += n 은 동작하나, 새로운 튜플을 만들어 참조하는 객체가 다르게 되므로,
= 기존 (1, 3) 과 (1, 3, 5, 7)은 다른 주소 정보를 가지고 있으므로, 함수가 동작하지 않는것처럼 보인다.
= 기존 리스트 경우에서는 t = m 이였으나, 튜플의 경우 t != m 이다.
때문에 튜플에 값을 추가한 결과를 얻는 함수는 다음과 같이 만들어서 사용해야 한다.def add_tuple(t1, t2): t1 += t2 return t1 tp = (1, 3) tp = add_tuple(tp, (5, 7)) tp > (1, 3, 5, 7)
예제
[리스트]def min_max(d): d.sort() print(d[0], d[-1], selp = ', ')
l = [3, 1, 5, 4] min_max(l) > 1, 5 l > [1, 3, 4, 5]
원본이 sort 메서드로 인해 변경이 된다.
원본이 변경되지 않길 원한다면,def min_max2(d): d = list(d) d.sort() print(d[0], d[-1], selp = ', ')
l = [3, 1, 5, 4] min_max2(l) > 1, 5 l > [3, 1, 5, 4]
기존 리스트를 복사를 해서 사용을 해야한다.
- 원본은 가급적 수정하지 않는것이 좋다.
(튜플)
t = (2, 7, 5, 9, 0) min_max2(t) > 0,9 t > (2, 7, 5, ,9, 0)
결론
함수를 잘 정의하려면 파이썬 내에서 참조하거나 조작하는 객체의 성격을 구분하고 그에 맞게 함수를 정의해야 한다.