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

유동헌·2021년 9월 25일
0

열혈파이썬_중급

목록 보기
2/8

immutable & mutable

객체가 지닌 값의수정이 불가능한 객체를 가리켜 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)
  • 추가되지 않았다. 이유는 함수 내에서 진행한 += 연산 과정에서 그 결과에 해당하는 새로운 튜플이 만들어졌기 때문이다. 원본에 값이 추가된 것이 아니다.
  • 함수 내의 변수 m에는 새로 만들어진 덧셈 결과가 반영된 튜플이 저장된다. 그러나 이때부터 t가 참조하는 튜플과 m이 참조하는 튜플은 별개의 것이 된다. 따라서 함수를 빠져나간 뒤에 확인해본 t의 내용에는 아무런 변화가 없다.
>>> 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)

정리

함수를 잘 생성하려면 파이썬 내에서 참조하거나 조작하는 객체의 성격을 구분하고 그에 맞게 함수를 정의해야 한다. 따라서 기본적인 문자열과 튜플은 변경이 불가능한 객체이고, 리스트와 딕셔너리는 변경이 가능한 객체라는 사실은 기억하고 있어야 한다.

profile
지뢰찾기 개발자

0개의 댓글