python - "weakly-referenced object no longer exists"是什么意思?

标签 python

我正在运行 Python 代码并收到以下错误消息:

Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <bound method crawler.__del__ of <searchengine.crawler instance at 0x2b8c1f99ef80>> ignored

有人知道这是什么意思吗?

附: 这是产生错误的代码:

import sqlite

class crawler:

  def __init__(self,dbname):
    tmp = sqlite.connect(dbname)
    self.con = tmp.cursor()

  def __del__(self):
    self.con.close()

crawler =  crawler('searchindex.db')

最佳答案

一个普通的 AKA 强引用是一个保持被引用对象事件的引用:在 CPython 中,每个对象都会保留对其存在的(正常)引用的数量(称为它的“引用计数”或 RC)并消失一旦 RC 达到零(偶尔的世代标记和扫描通过也偶尔会垃圾收集“引用循环”)。

当您不希望一个对象仅仅因为另一个对象引用它而保持事件状态时,您可以使用“弱引用”,一种不会增加 RC 的特殊引用;见 the docs详情。当然,因为如果没有被引用,被引用的对象可以消失(弱引用的全部目的而不是正常的引用!-),如果引用对象试图使用一个对象,则需要警告它那已经消失了——并且该警报正是由您看到的异常发出的。

在您的代码中...:

def __init__(self,dbname):
    tmp = sqlite.connect(dbname)
    self.con = tmp.cursor()

def __del__(self):
    self.con.close()

tmp 是对连接的正常引用...但它是一个局部变量,所以它在 __init__ 的末尾消失。 (特别命名的)光标 self.con 保持不变,但它在内部实现为仅保存连接的 WEAK 引用,因此当 tmp 执行时连接消失。因此,在 __del__ 中,对 .close 的调用失败(因为光标需要使用连接才能关闭自身)。

最简单的解决方案是以下微小的变化:

def __init__(self,dbname):
    self.con = sqlite.connect(dbname)
    self.cur = self.con.cursor()

def __del__(self):
    self.cur.close()
    self.con.close()

我也借此机会将 con 用于连接,将 cur 用于光标,但如果您热衷于交换它们,Python 不会介意(您只会让读者感到困惑)。

关于python - "weakly-referenced object no longer exists"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482141/

相关文章:

python - 在条形图动画的每次迭代中添加新的数据箱

python - django.db.utils.IntegrityError : The row in table 'main_page_projects' with primary key '1' has an invalid foreign key 错误

python - 无法安装 PyDev eclipse 插件

python - 如何使用 Python 从 Excel 文件中提取单元格格式(粗体、斜体、...)?

python - 为什么 Python 枚举中的可变值是同一个对象?

python - 如何按给定值反转列表?

python - 如何将值从循环存储到数据框?

python - 如何从 python 中的 Windows 剪贴板读取 jpg 或 png,反之亦然?

Python Ray 似乎会为每个远程函数调用复制对象

python - 为什么 pip editable install 会导致子包出现问题?