Python布尔值在documentation中的描述如下:
在Python中,布尔值是作为整数的子类实现的.只有两个布尔值,Py_False和Py_True.
据我所知,Py_False
和Py_True
是分别对应False
和True
的单身人士.
事实上,在我的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_True
和Py_False
是defined,具体如下:
/* 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个关于递增引用计数是否总是必要的信息,但我仍然不明白为什么首先需要它,因为True
和False
对象是单例对象,永远不会被垃圾收集.
我不确定我是否遗漏了一些明显的东西,但有人能解释一下为什么在返回引用到Py_False
或Py_True
时有必要增加引用计数吗?或者这是为了防止对象被垃圾收集?