본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 02. 수정 가능한 객체와 수정 불가능한 객체

출처 : 윤성우의 열혈 파이썬 : 중급

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]
  • 원본의 변경을 원치 않으면, 함수 내에서 리스트를 복사한 다음 정렬 진행

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