它是什么意思"弱引用对象不再存在"?

Ver*_*tex 18 python

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

Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <bound method crawler.__del__ of <searchengine.crawler instance at 0x2b8c1f99ef80>> ignored
Run Code Online (Sandbox Code Playgroud)

有谁知道这意味着什么?

PS这是产生错误的代码:

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')
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 32

正常的AKA强引用是使引用对象保持活动的引用:在CPython中,每个对象保持存在的(正常)引用的数量(称为"引用计数"或RC),并且尽快消失RC达到零(偶尔的世代标记和扫描通道也会偶尔垃圾收集"参考循环").

当你不希望一个对象只是因为另一个引用它而保持活着时,那么你使用一个"弱引用",一种不增加RC的特殊引用; 有关详细信息,请参阅文档.当然,由于引用的对象如果没有另外引用就会消失(弱引用的整个目的而不是正常的引用! - ),如果它试图使用一个对象,则需要警告引用对象那已经消失了 - 而且这个警报完全由您所看到的例外情况给出.

在你的代码......:

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

  def __del__(self):
    self.con.close()
Run Code Online (Sandbox Code Playgroud)

tmp是连接的常规引用...但它是一个局部变量,所以它在结束时消失了__init__.该(特有命名;-)光标self.con停留,但它的内部实现仅持有弱裁判的连接,所以连接消失时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()
Run Code Online (Sandbox Code Playgroud)

我也考虑使用CON连接和CUR对光标的机会,但如果你是热衷于交换的(你就离开困惑的读者;-) Python会不会介意.