为什么在C中按如下所示返回Py_None之前,需要Py_INCREF(Py_None)?
Py_INCREF(Py_None);
return Py_None;
如果省略Py_INCREF(Py_None),会发生什么?
参考方案
缺少Py_INCREF
将导致对Py_None
的引用计数不正确,这可能会导致解释器取消分配Py_None
。由于Py_None
是在Objects/object.c
文件中静态分配的,因此:
PyObject _Py_NoneStruct = {
_PyObject_EXTRA_INIT
1, &PyNone_Type
};
在Include/object.h
中有一个定义:
#define Py_None (&_Py_NoneStruct)
所以将会发生的是,解释器将崩溃并出现致命错误:
Fatal Python error: deallocating None
由none_dealloc
中的Objects/object.c
函数生成:
/* ARGUSED */
static void
none_dealloc(PyObject* ignore)
{
/* This should never get called, but we also don't want to SEGV if
* we accidentally decref None out of existence.
*/
Py_FatalError("deallocating None");
}
如该评论所述,如果NoneType
没有其自己的解除分配功能,则将获得Segmentation Fault,因为free
调用将在堆栈上完成。
您可以在tutorial中复制示例进行测试,将对Py_DECREF(Py_None)
的调用添加到Noddy_name
函数中,构建扩展并执行循环调用该方法。
在一般情况下,0
的引用计数可能导致程序以多种不同方式失败。
特别是python可以自由地重用被释放对象使用的内存,这意味着突然之间对对象的每个引用都可以成为对随机对象(或对空内存位置)的引用,并且您会看到类似:
>>> None #or whatever object that was deallocated
<ARandomObjectYouNeverSawBefore object at ...>
(在编写C扩展名时,有时对我来说实际上是happened。由于缺少对Py_INCREF
的调用,某些对象在随机时间变为只读缓冲区)。
在其他情况下,可能会引发不同类型的错误,或者解释器可能崩溃或出现段错误。
在Django中聚合save()? - python我正在使用带有sqlite后端的Django,并且写入性能是一个问题。在某个阶段,我可能会毕业于“适当的”数据库,但是目前我仍然坚持使用sqlite。我认为我的写入性能问题可能与以下事实有关:我创建了大量行,并且大概每次save()一个行时,它都会锁定,解锁和同步磁盘上的数据库。如何将大量save()调用聚合到一个数据库操作中? 参考方案 编辑:不建议使用c…
如何在Linux上安装2个Anacondas(Python 2.7和3.5)? - python我想使用Python 2和3版本。我已经读过有关conda环境的用法,但是不断向终端source (de)activate py27写入内容似乎不方便。如picture所示,如何使用命令选择内核版本? 参考方案 您在该图像中寻找的是Jupyter Notebook。您需要使用Jupyter和所需的python版本创建环境:conda create -n py…
Coverage.py:如何为从外壳程序脚本调用的多个python脚本附加结果 - python我正在使用带有参数调用多个python代码的shell脚本。现在,我的要求是收集整个项目的报告。任何想法如何在整个代码上运行coverage.py并生成合并的报告。以下是我正在使用的shell脚本的高级模板。如果有人可以指导如何实现上述要求。#!/bin/bash variable=$1 /usr/bin/python python1.py $variabl…
py.test:如何从设置方法中获取当前测试的名称? - python我正在使用py.test,想知道是否/如何在运行每个测试之前调用的setup方法内检索当前执行的测试的名称。考虑以下代码:class TestSomething(object): def setup(self): test_name = ... def teardown(self): pass def test_the_power(self): assert…
“ python setup.py egg_info”失败,错误代码为1。如何解决此问题 - python我该如何解决。我找不到任何带有“ Temp \ pip-install-7utykvpt \ polyglot”的目录C:\Windows\system32>pip install polyglot Collecting polyglot Using cached https://files.pythonhosted.org/packages/e7/9…