Python 为什么假值(0)的字节数小于真值(1)?

Python 为什么假值(0)的字节数小于真值(1)?,python,types,size,cpython,Python,Types,Size,Cpython,我在玩sys的getsizeof()时发现False(或0)包含的字节数少于True(或1)。为什么呢 import sys print("Zero: " + str(sys.getsizeof(0))) print("One: " + str(sys.getsizeof(1))) print("False: " + str(sys.getsizeof(False))) print("True: " + str(sys.getsizeof(True))) # Prints: # Zero:

我在玩
sys
getsizeof()
时发现
False
(或
0
)包含的字节数少于
True
(或
1
)。为什么呢

import sys

print("Zero: " + str(sys.getsizeof(0)))
print("One: " + str(sys.getsizeof(1)))
print("False: " + str(sys.getsizeof(False)))
print("True: " + str(sys.getsizeof(True)))

# Prints:
# Zero: 24
# One: 28
# False: 24
# True: 28
事实上,其他数字(也有一些由一个以上的数字组成)是28字节

for n in range(0, 12):
  print(str(n) + ": " + str(sys.getsizeof(n)))

# Prints:
# 0: 24
# 1: 28
# 2: 28
# 3: 28
# 4: 28
# 5: 28
# 6: 28
# 7: 28
# 8: 28
# 9: 28
# 10: 28
# 11: 28
甚至更多:
sys.getsizeof(999999999)
也是28字节<但是,code>sys.getsizeof(9999999999)是32

发生了什么事?我假设布尔值
True
False
分别在内部转换为
0
1
,但为什么零的大小不同于其他较低的整数


附带问题:这是特定于Python(3)如何表示这些项,还是这通常是操作系统中数字的表示方式?

记住Python
int
值的大小是任意的。这是怎么回事

在CPython中,int由一个
PyLong_对象
表示,该对象有一个4字节的chunks2数组,每个chunks2包含30位的数字

  • 0
    完全不接受块

  • 1
    -
    (1在python2.7上,我得到“24”对于所有这些。我在3.6上复制了您的结果。这似乎是特定于python3的。它非常特定于Python。大多数编程语言没有任意精度的整数,您必须选择数据类型,如
    int
    long
    long
    ,等等。它们的大小都是固定的。@jordanm它不完全是python3的具体来说,如果比较
    0L
    1L
    等,您会在Python 2中看到相同的情况。区别在于Python 2中的
    int
    (固定大小的32位有符号整数)和
    long
    (任意大小的整数)有不同的类型,而Python3将
    long
    重命名为
    int
    并去掉了
    int
    。用非常通俗的术语来说,说空的
    PyLong_对象
    需要24个字节有意义吗?一个空数组的
    PyLong_对象
    与零相同。只要你真的有一个int>0,对象的数组就不再是空的了e、 因此,它的4字节块数组被填满,解释了大小的增加?@BramVanroy是的,没错(要更深入地理解它,你需要了解C)。