Python布尔值在documentation中的描述如下:

在Python中,布尔值是作为整数的子类实现的.只有两个布尔值,Py_False和Py_True.

据我所知,Py_FalsePy_True是分别对应FalseTrue的单身人士.

事实上,在我的Jupyter笔记本中,以下是True的回报:

a = True
b = True
a is b

False的工作原理是一样的.

PyBool_FromLong方法(代码here)从long创建一个新的布尔对象.但是,它会创建一个指向它的全新指针,并在返回它之前递增引用计数:

PyObject *PyBool_FromLong(long ok)
{
    PyObject *result;

    if (ok)
        result = Py_True;
    else
        result = Py_False;
    return Py_NewRef(result);
}

Py_TruePy_Falsedefined,具体如下:

/* Py_False and Py_True are the only two bools in existence.
Don't forget to apply Py_INCREF() when returning either!!! */

/* Don't use these directly */
PyAPI_DATA(PyLongObject) _Py_FalseStruct;
PyAPI_DATA(PyLongObject) _Py_TrueStruct;

/* Use these macros */
#define Py_False _PyObject_CAST(&_Py_FalseStruct)
#define Py_True _PyObject_CAST(&_Py_TrueStruct)

上面的注释坚持要求您在返回任何一个时增加引用计数,这正是我上面展示的方法所做的.不过,我有点搞不懂为什么这是必要的,因为(据我所知)这些只是单例,永远不会被垃圾收集.

我找到了this Q&A个关于递增引用计数是否总是必要的信息,但我仍然不明白为什么首先需要它,因为TrueFalse对象是单例对象,永远不会被垃圾收集.

我不确定我是否遗漏了一些明显的东西,但有人能解释一下为什么在返回引用到Py_FalsePy_True时有必要增加引用计数吗?或者这是为了防止对象被垃圾收集?

推荐答案

在Python中,当不再有对对象的引用时,对象将被垃圾回收.这意味着当您创建新对象时,Python将跟踪存在多少对该对象的引用,并在引用计数达到零时自动删除该对象.

Py_False和Py_True对象的特殊之处在于它们是单例对象,这意味着每个对象只有一个实例.正因为如此,可以保证始终至少有一个对这些对象的引用,因此它们永远不会被垃圾回收.

但是,当创建对Py_False或Py_True的新引用时,该对象的引用计数需要递增.这是因为引用计数用于跟踪对对象的引用数量,并且它需要准确才能使Python正确地管理其内存.

对于PyBool_FromLong,该方法根据输入参数的值创建对Py_False或Py_True的新引用.然后,它在返回新引用之前递增该对象的引用计数.这确保了对Py_False和Py_True的引用计数是准确的,并且确保了Python可以正确地管理其内存.

Python相关问答推荐

需要计算60,000个坐标之间的距离

使用setuptools pyproject.toml和自定义目录树构建PyPi包

try 将一行连接到Tensorflow中的矩阵

如何从pandas的rame类继承并使用filepath实例化

创建可序列化数据模型的最佳方法

如何在Python中找到线性依赖mod 2

Plotly Dash Creating Interactive Graph下拉列表

用渐近模计算含符号的矩阵乘法

在两极中过滤

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

使用Openpyxl从Excel中的折线图更改图表样式

如何使用Azure Function将xlsb转换为xlsx?

如何重新组织我的Pandas DataFrame,使列名成为列值?

我什么时候应该使用帆布和标签?

利用SCIPY沿第一轴对数组进行内插

python3中np. divide(x,y)和x/y有什么区别?'

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError

Python:在cmd中添加参数时的语法

为什么在安装了64位Python的64位Windows 10上以32位运行?

Pandas dataframe中str.place()的奇怪行为.删除与目标字符串不匹配的值