파이썬3에서 True와 False의 객체 크기가 왜 다른가요? (번역)
https://stackoverflow.com/questions/53015922/different-object-size-of-true-and-false-in-python-3
질문
다른 Python 객체들 간에 매직 메서드(특히 sizeof)를 실험해보면서 다음 동작을 발견했습니다.
Python 2.7
False.sizeof()
24
True.sizeof()
24
Python 3.x
False.sizeof()
24
True.sizeof()
28
3에서 무엇이 바뀌었기에 False보다 True의 크기가 커진 건가요?
답변1
파이썬2와 3에서 bool은 int의 서브클래스이기 때문입니다.
issubclass(bool, int)
True
그런데 int의 구현이 바뀐 거죠.
파이썬 2에서. int는 32비트나 64비트 둘중 하나로, 시스템에 의존적이었습니다.
그런데 파이썬 3에서 int가 임의 길이가 돼버렸죠. 원래의 int는 증발했습니다.
파이썬 2에서는 long 객체 1L과 0L이 동일한 동작을 합니다.
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import sys
sys.getsizeof(1L)
28
sys.getsizeof(0L)
24
그런데 long/Python 3 int는 튜플과 마찬가지로 가변 길이 객체입니다.
할당되면 이를 나타내는 데 필요한 모든 이진수를 저장할만한 메모리가 할당됩니다.
그 가변적인 부분의 길이는 객체 앞부분에 저장됩니다.
그래서 0은 이진수가 필요하지 않아서 변수 길이도 0이 되고, 1은 넘쳐나서 추가 숫자가 필요한 거죠.
즉, 0은 길이 0짜리 2진 문자열로 표현됩니다.
<>
그리고 1은 30비트 2진 문자열로 표현되고요.
<000000000000000000000000000001>
Python의 기본 구성은 uint32_t에서 30 비트를 사용합니다.
그래서 230-1은 x86-64에서 여전히 28 바이트에 딱 맞고 230에는 32가 필요합니다.
2 ** 30-1은 다음과 같이 표시됩니다.
<111111111111111111111111111111>
즉, 모든 30 값 비트가 1로 설정되죠. 2**30은 더 필요할 거고, 내부 표현을 가질겁니다.
<000000000000000000000000000001000000000000000000000000000000>
True가 24 대신 28 바이트를 사용하는 것은 걱정할 필요가 없습니다.
True는 싱글톤이라서, 여러번 사용하더라도 전체 프로그램에서 4바이트만을 차지할 뿐이거든요.





