为什么在C中返回Py_None之前需要Py_INCREF(Py_None)? - python

为什么在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…