파이썬 int 타입의 특이한 내부구현

파이썬에서 built-in 타입을 포함한 모든 타입은 object라고 알고 있었는데, 특이한 현상을 겪었다.

 

a = 10
b = 10
a is b # True

위 코드를 실행하면 항상 True가 반환된다.

반대로 아래 코드를 실행 하면 항상 False가 반환된다.

 

c = 500
d = 500
c is d # False

서로 다른 Object 이기 때문에 항상 False가 반환되어야 할 텐데 왜 앞의 경우는 True가 반환되는 것일까?

CPython Documentation의 다음과 같은 설명으로부터 이유를 알 수 있었다.

 

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. :-)

 

[-5,256] 까지의 값에 대해서는 매번 객체를 만들지 않아도 되게 미리 만들어 놓고 만들어진 객체의 레퍼런스를 공유하기 때문이라고 한다.

 

immutable in built-in type

파이썬 built-in type의 immutable 여부

OOP에서 생성된 이후에는 변경될 수 없는 객체를 immutable이라고 부른다. 파이썬에서는 list, set, dictionary를 제외한 모든 builtin-type은 immutable이기 때문에 변경할 수 없다. 따라서 값이 바뀌어야 할 때 마다 객체를 지우고 다시 만들게 된다.

 

앞에서와 같은 int의 구현은 객체가 계속 만들어지고 삭제될때 생기는 성능 문제를 피하기 위한 지저분한 해결책으로 나온 것 같다.

'software' 카테고리의 다른 글

Ubuntu에서 Rust 설치하기  (0) 2020.09.07
Google Cloud(GCP) - Pub/Sub  (0) 2019.11.03
C, C++로 작성된 코드를 파이썬에서 사용하기  (0) 2019.10.22
우분투 개발용 환경 설정  (0) 2019.09.01