All Articles

파이썬 기억 더듬기 (8) - 가변형 객체와 불변형 객체

가변형 객체와 불변형 객체

불변객체(불변형)에 대해 좀 더 짚고 넘어가보자.

def sum_params(x, y):
  x += y
  return x

이런 함수가 있을 때,

x = 10
y = 5

print(sum_params(10, 5))
print('x = ', x)
print('y = ', y)
15
x = 10
y = 5

x는 정수형이므로 불변형 객체라 x += y 연산에서도 원본값이 변하지 않았다.


가변형 객체인 리스트는 어떨까?

a = [10, 20]
b = [100, 1000]

print(sum_params(a, b))
print('a = ', a)
print('b = ', b)
[10, 20, 100, 1000]
a = [10, 20, 100, 1000]
b = [100, 1000]

원본이 변경되었다.


불변형 객체인 튜플도 원본이 변경되지 않는다.

c = (10, 20)
d = (100, 1000)

print(sum_params(c, d))
print('c = ', c)
print('d = ', d)
(10, 20, 100, 1000)
c = (10, 20)
d = (100, 1000)

불변형 예외

str, bytes, frozenset, tuple 자료형은 사본 생성하지 않고 참조 반환(원본 반환)한다.

tt1 = (1, 2, 3, 4, 5)
tt2 = tuple(tt1)
tt3 = tt1[:]
print(tt1 is tt2)
print(id(tt1), id(tt2))
print(id(tt1), id(tt3))
True
140297791971392 140297791971392
140297791971392 140297791971392

tt1, tt2, tt3 id값이 모두 같다. 불변형이지만 효율성을 위해 사본을 생성하지 않고 같은 객체를 그대로 쓴다. 따라서 어떻게 복사해도 같은 객체다.


tt4 = (10, 20, 30, 40, 50)
tt5 = (10, 20, 30, 40, 50)
ss1 = 'Apple'
ss2 = 'Apple'
print('tt4 is tt5', tt4 is tt5)
print('ss1 is ss2', ss1 is ss2)
True
True

튜플이나 문자열도 마찬가지다.