파이썬의 특이한 불변형 처리법

매일 공부(ML)·2023년 1월 3일
0

Fluent Python

목록 보기
55/130

객체지향 상용구

객체 참조, 가변성, 재활용

파이썬의 특이한 불변형 처리법

튜플 t에 대해 t[:]가 사본을 생성하지않고 그 객체에 대한 참조를 반환한다는 사실로, tuple(t)로 작성하더라도 튜플 t에 대한 참조가 반환된다.

t1 = (1,2,3)
t2 = tuple(t1)
t2 is t1 #True
t3 = t1[:]
t3 is t1 #True

str,bytes, frozenset 객체에서도 동일한 동작으로 frozenset이 시퀀스가 아니므로 frozenset 형인 fs에 대해 fs[:]는 작동하지 않지만, fs.copy()는 동일하게 작동하므로 fs.copy()는 사본이 아니라 동일 객체에 대한 참조를 반환한다.

#스트링 리터러은 공유 객체를 생성하기도 한다.


t1 = (1,2,3)
t3 = (1,2,3)

t3 is t1 #False
s1 ='ABC'
s2 = 'ABC'
s2 is s1 #True

문자열 리터럴을 공유하는 최적화 기법을 인터닝이라고 하는데 CPython 에선 0,-1,42등 인기있는 숫자를 불필요하게 중복하지 않도록 작은 정수에도 동일한 기법을 사용하고, CPython이 모든 문자열이나 정수를 인터닝하는 것은 아니며, 인터닝 기준은 구현 특징으로서 문서화 되어있지 않다.

frozenset.copy()의 작동 등 이 절에서 설명한 기법은 '선의의 거짓말'로서, 메모리 사용량을 줄이고 인터프리터가 더 빨리 실행되게 하므로 이런 특성에 대해 너무 신경 쓸 필요는 없다. 불변형에만 적용되므로 아무런 문제도 생기지 않는다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글