수정 가능한 객체와 수정 불가능한 객체

김건우·2021년 12월 7일
0

파이썬

목록 보기
2/18
post-thumbnail

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)

결론
함수를 잘 정의하려면 파이썬 내에서 참조하거나 조작하는 객체의 성격을 구분하고 그에 맞게 함수를 정의해야 한다.

profile
공부하는 개발자가 목표입니다.

0개의 댓글