출처 : 윤성우의 열혈 파이썬 : 중급
02. 수정 가능한 객체와 수정 불가능한 객체
- 수정 불가능한 객체(immutable object) : 객체가 지닌 값의 수정이 불가능한 객체
- tuple, string ...
- 수정 가능한 객체(mutable object) : 객체가 지닌 값의 수정이 가능한 객체
- list, dictionary ...
r = [1,2]
id(r)
r += [3,4]
id(r) # 리스트의 주소가 바뀌지 않음
t = (1,2)
id(t)
t += (3,4)
id(t) # t에 저장된 튜플이 바뀌었음을 확인
성격에 따라 달라지는 함수의 정의
def add_last(m, n):
m += n
r = [1, 2]
add_last(r, [3, 4])
print(r) # [1.2.3.4]
t = (1, 3)
add_last(t, (5, 7))
print(t) # (1, 3)
- 함수 내에서 진행한 연산 과정에서 그 결과에 해당하는 새로운 튜플이 만들어진다
- 원본에 값이 추가되지는 않는다
- 함수 내 연산 시, t가 참조하는 튜플과 m 이 참조하는 튜플은 별개의 것이 된다
def add_tuple(t1, t2):
t1 += t2
return t1
tp = (1, 3)
tp = add_tuple(tp, (5, 7))
print(tp) # (1, 3, 5, 7)
- 리스트는 변경 가능한 객체, 튜플은 변경 불가능한 객체이기 때문에 원하는 결과를 얻을 수 있는 함수를 리스트와 튜플 각각에 대해 별도로 정의해야 한다
def min_max(d):
d.sort()
print(d[0], d[-1], sep = ', ')
l = [3, 1, 5, 4]
min_max(l) # 1, 5
print(l) # [1, 3, 4, 5]
def min_max2(d):
d = list(d)
d.sort()
print(d[0], d[-1], sep = ', ')
l = [3, 1, 5, 4]
min_max2(l) # 1, 5
print(l) # [3, 1, 5, 4]
- 원본의 변경을 원치 않으면, 함수 내에서 리스트를 복사한 다음 정렬 진행
결론 : 함수를 잘 정의하려면 파이썬 내에서 참조하거나 조작하는 객체의 성격을 구분하고 그에 맞게 함수를 정의해야 한다
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 04. list comprehension (0) | 2020.12.15 |
---|---|
[윤성우의 열혈 파이썬 중급편] 03. 깊은 복사와 얕은 복사 (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 01. reference count와 garbage collection (0) | 2020.12.15 |
[Effective Python 복습] Chapter 8. 제품화 (0) | 2020.12.13 |
[Effective Python 복습] Chapter 7. 협력 (0) | 2020.12.13 |