객체가 지닌 값의수정이 불가능한 객체를 가리켜 immutable 객체
라고 하며 대표적인 예로 튜플과 문자열이 있다. 반면 객체가 지닌 값의 수정이 가능한 객체를 가리켜 mutable 객체
라 하며 대표적인 예로 리스트와 딕셔너리가 있다.
<리스트의 주소가 바뀌지 않았음을 확인>
>>> r = [1,2,3]
>>> id(r)
140521534017792
>>> r += [4,5]
>>> id(r)
140521534017792
<튜플의 주소가 바뀌었음을 확인>
>>> t = (1,2,3)
>>> id(t)
140521533580800
>>> t = (4,5)
>>> id(t)
140521534075840
def add_last(m, n):
m += n
r = [1,2]
add_last(r, [3,4])
print(r)
튜플로 해보자.
def add_last(m, n):
m += n
r = (1,2)
add_last(r, (3,4))
print(r)
# 출력
(1, 2)
>>> 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], sep = ' , ')
l = [3,7,9,1,0,8]
print(min_max(l))
# 출력
0 , 9
print(l)
# 출력
[0, 1, 3, 7, 8, 9]
위의 함수는 가장 작은 값과 가장 큰 값을 반환하는 함수이다.
출력된 내용을 보면 가장 큰 값과 가장 작은 값이 잘 출력이 되었다. 하지만 원본의 저장 순서가 변경되었다. 따라서 이러한 상황을 원치 않으면 함수 내에서 리스트를 복사한 다음에 정렬을 진행해야 한다.
def min_max(d):
d = list(d)
d.sort()
print(d[0], d[-1], sep = ' , ')
l = [3,7,9,1,0,8]
print(min_max(l))
print(l)
# 출력
0 , 9
None
[3, 7, 9, 1, 0, 8]
<튜플>
def min_max(d):
d = list(d)
d.sort()
print(d[0], d[-1], sep = ' , ')
l = (3,7,9,1,0,8)
print(min_max(l))
print(l)
# 출력
0 , 9
None
(3, 7, 9, 1, 0, 8)
함수를 잘 생성하려면 파이썬 내에서 참조하거나 조작하는 객체의 성격을 구분하고 그에 맞게 함수를 정의해야 한다. 따라서 기본적인 문자열과 튜플은 변경이 불가능한 객체이고, 리스트와 딕셔너리는 변경이 가능한 객체라는 사실은 기억하고 있어야 한다.