如果我有以下代码:
import sqlite
sqlite.connect('tmp.db').cursor().close()
我收到以下错误消息:
Traceback (most recent call last):
File "searchengine2.py", line 13, in ?
sqlite.connect('tmp.db').cursor().close()
File "/usr/lib64/python2.4/site-packages/sqlite/main.py", line 280, in close
if self.con and self.con.closed:
ReferenceError: weakly-referenced object no longer exists
但是,如果我按以下方式修改代码:
import sqlite
x1 = sqlite.connect('tmp.db')
x2 = x1.cursor()
x3 = x2.close()
一切都很好。为什么?
答案 0 :(得分:3)
显然cursor
保留了对连接的弱引用(self.con
)。因为您链接了这些函数,所以一旦实例化游标,您实例化的连接就超出了范围 - 没有任何东西保留对该连接的强引用,并且该连接符合垃圾收集的条件
因此,当您尝试close
光标(反过来尝试close
连接)时,连接已经超出范围并且可能已被垃圾收集 - 如果它是的,然后连接已经关闭。
如果不修改游标的来源使其保持对连接的强引用,就没有办法解决这个问题,并且如果你这样做,就没有简单的方法可以告诉你可能会引入多少问题。 (好)设计师在没有充分理由的情况下不会随意制作弱引用。
(希望您理解来自your last question的弱引用。)
答案 1 :(得分:1)
看起来cursor()
返回(并保留)对连接的弱引用,这样,当您对连接的强引用不在调用堆栈中时,您的连接({{1}的结果)留下没有任何强引用。因此,在调用connect()
时,您的连接已被破坏。
第二种形式通过在整个时间内保持对您的连接的强引用来避免这种情况。