【问题标题】:What is the value stored in the memory space of a boolean?布尔值的内存空间中存储的值是多少?
【发布时间】:2015-12-22 04:14:36
【问题描述】:

我不太了解内存空间分配。对于每个变量都会分配一个内存空间,那么对于 Python 中的布尔变量,该变量的内存空间中将存储什么值?

【问题讨论】:

  • Python 将内存管理抽象出来,所以不用担心!它也有 names 而不是变量。
  • 您可以使用sys.getsizeof(),但作为@jonrsharpe,您不需要担心这一点,除非您有特定的理由
  • 如果您真的感兴趣,请查看boolobject.c,它是 CPython 布尔值的底层实现。
  • True is True 因此所有True 值可能是同一个对象
  • @jonrsharpe:从技术上讲,per-bool 结构的定义可以在 Py3 中的 definition of a PyLong's struct _longobject 中找到(PyLong 是 Py3 中 int 的 C 名称),所以boolobject.c 实际上并没有描述实例布局。

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


【解决方案1】:

注意:以下描述适用于 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 中作为带符号的size_t,或单个元素数组Python 3 中的 16 位或 32 位值)。

【讨论】:

  • 如果a is bab 是指同一个对象的两个名称。它不依赖于 Python 实现。
  • 是的,因为bools 在 CPython 中是单例,所以引用 True 的两个名称将始终是相同的 True(并且所有对 False 的引用都引用相同的 False) .
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2010-10-25
    • 2012-03-10
    • 2018-04-18
    • 2019-07-24
    相关资源
    最近更新 更多