我对内存空间分配知之甚少。对于每个变量,都会分配一个内存空间,因此在Python中的布尔变量的情况下,哪个值将存储在该变量的内存空间中?
答案 0 :(得分:2)
注意:以下描述适用于Python的CPython参考解释器。其他口译员的实施细节会有所不同,例如: PyPy,Jython,IronPython等
Python的bool
个对象是单例。所以如果你说:
a = True
b = bool('nonzerolen')
然后你有两个引用(名为a
和b
)到True
的单例实例;除了用于保存每个引用的指针外,不分配额外的内存。
对于实例本身,bool
是int
的子类,因此实例与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 True
和False 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 CPython。 bool
是int
子类;这里how int
is represented in CPython。