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
,等等。它们的大小都是固定的。@jordanm它不完全是python3的具体来说,如果比较long
、0L
等,您会在Python 2中看到相同的情况。区别在于Python 2中的1L
(固定大小的32位有符号整数)和int
(任意大小的整数)有不同的类型,而Python3将long
重命名为long
并去掉了int
。用非常通俗的术语来说,说空的int
需要24个字节有意义吗?一个空数组的PyLong_对象
与零相同。只要你真的有一个int>0,对象的数组就不再是空的了e、 因此,它的4字节块数组被填满,解释了大小的增加?@BramVanroy是的,没错(要更深入地理解它,你需要了解C)。PyLong_对象