[Python] 2. 수정 가능한 객체와 수정 불가능한 객체
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
2-1. Immutable & Mutable
Mutable 객체: 객체가 지닌 값의 수정이 가능한 객체
Ex) 리스트, 딕셔너리
today = ['공부하자', '운동하자']
id(today)
(결과) 1896625928712
today += ['요리하자', '일찍자자']
id(today)
(결과) 1896625928712
Immutable 객체: 객체가 지닌 값의 수정이 불가능한 객체
Ex) 튜플, 문자열
today = ('공부하자', '운동하자')
id(today)
(결과) 1896629021000
today += ('요리하자', '일찍자자')
id(today)
(결과) 1896627911800
보다시피, 튜플은 저장된 값을 수정하면 새로운 튜플이 만들어진다.
2-2. 성격에 따라 달라지는 함수의 정의
다음과 같이 두 리스트 형태의 계획을 합쳐주는 함수 코드가 있다고 하자.
def add_plan(def_fisrt_plan, def_second_plan):
def_first_plan += def_second_plan
리스트로 Plan을 세워 위 함수를 적용하는 경우 결과가 잘 나온다.
first_plan = ['공부하자', '운동하자']
add_plan(first_plan, ['요리하자', '일찍자자'])
first_plan
(결과) ['공부하자', '운동하자', '요리하자', '일찍자자']
하지만 튜플로 Plan을 세워 위 함수를 적용하는 경우 결과가 안나온다.
first_plan = ('공부하자', '운동하자')
add_plan(first_plan, ('요리하자', '일찍자자'))
first_plan
(결과) ('공부하자', '운동하자')
차이가 뭘까?
리스트를 활용할 경우, 변수 first_plan과 매개변수 def_first_plan이 참조하는 메모리 주소는 동일하다. 반면 튜플을 활용할 경우, 변수 first_plan과 매개변수 def_first_plan이 참조하는 메모리 주소가 다르다.
즉, 튜플을 활용하면 def_first_plan 매개변수를 위한 새로운 메모리가 할당되고 덧셈 연산 결과가 여기에 저장된다. 그러니 first_plan 변수는 그대로일 수밖에…!
다음 코드를 보자.
def print_min_max(number):
# number = list(number) # number의 내용이 담긴 새로운 리스트 생성
number.sort() # 새로 만든 리스트(기존 리스트와 메모리 주소 다름) 오름차순 정렬
print(number[0], number[-1], sep=', ')
num = [10000, 100, 1000, 10]
print_min_max(num)
(결과) [10, 100, 1000, 10000]
리스트를 그대로 활용하면, 당연히 기존 변수 num도 오름차순 정렬된 리스트를 갖게 된다. 만약 매개변수 number와 변수 num이 서로 다른 리스트를 갖게 하려는게 의도 였다면? 상기 코드의 주석 부분을 제거하여 활성화하자! 설명은 주석의 주석으로 대체한다.
결론: 함수를 잘 정의하려면 파이썬 내 참조하거나 조작하는 객체의 성격을 구분하고, 그에 맞게 함수를 정의해야 한다!
(2022-01-02) 추가! Immutable 객체인 tuple과 str에 대해서도 각각 tuple, str 함수를 이용하여 똑같은 내용을 다른 변수에 저장하면 어떨까?
num = (10000, 100, 1000, 10)
num2 = '만 백 천 십'
copy_num = tuple(num)
copy_num2 = str(num2)
print(id(num), id(copy_num))
print(id(copy_num), id(copy_num2))
(결과) 2218795445288 2218795445288
2218795246032 2218795246032
오히려 리스트랑 반대로 Immutable 객체 생성 함수를 사용하여 복사하면 동일한 메모리 주소를 참조하게 된다.
Leave a comment