存储在布尔值的内存空间中的值是多少?

时间:2015-09-24 14:01:09

标签: python python-2.7 python-3.x boolean language-lawyer

我对内存空间分配知之甚少。对于每个变量,都会分配一个内存空间,因此在Python中的布尔变量的情况下,哪个值将存储在该变量的内存空间中?

2 个答案:

答案 0 :(得分:2)

注意:以下描述适用于Python的CPython参考解释器。其他口译员的实施细节会有所不同,例如: PyPy,Jython,IronPython等

Python的bool个对象是单例。所以如果你说:

a = True
b = bool('nonzerolen')

然后你有两个引用(名为ab)到True的单例实例;除了用于保存每个引用的指针外,不分配额外的内存。

对于实例本身,boolint的子类,因此实例与Python int具有相同的布局,值为0或1。该对象本身略有不同于Python 2到Python 3,但它基本上是标准的Python对象头(包括对类类型和引用计数的引用),加上0或1(作为带符号{{ Python 2中的1}},或Python 3中的16或32位值的单个元素数组。

答案 1 :(得分:2)

"Boolean values are the two constant objects False and True",即True is TrueFalse is False,对于任何Python 3程序都是如此(对于任何实现,不仅仅是CPython)。

只有两个布尔对象,无论在Python程序中有多少名称可以引用它们。

对象的大小可能取决于实现,例如,这是我的计算机上的结果:

>>> import sys
>>> sys.getsizeof(True)
28
>>> sys.getsizeof(False)
24

其中sys.getsizeof()以字节为单位返回对象的大小。

  

在Python中的布尔变量的情况下,哪个值将存储在该变量的内存空间中?

您可以查看CPython上的内存:

>>> import ctypes
>>> bytearray((ctypes.c_ubyte * sys.getsizeof(False)).from_address(id(False)))                            
bytearray(b'I\x02\x00\x00\x00\x00\x00\x00@V\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> bytearray((ctypes.c_ubyte * sys.getsizeof(True)).from_address(id(True)))
bytearray(b'9\x02\x00\x00\x00\x00\x00\x00@V\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00')

以下是相应的definitions in CPythonboolint子类;这里how int is represented in CPython