如果我有以下代码:
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()百事大吉。为什么?
发布于 2009-09-26 22:00:22
显然,cursor保留了对连接(self.con)的弱引用。因为您链接了函数,所以一旦实例化游标,您已经实例化的连接就超出了作用域--没有任何东西再持有对该连接的强引用,并且该连接有资格进行垃圾回收。
因此,当您尝试对游标执行close操作(进而尝试对连接执行close操作)时,该连接已经超出了作用域,并且可能已经被垃圾回收了--如果是这样,则该连接已经关闭。
如果不修改游标的源,使其包含对连接的强引用,就没有办法解决这个问题,而且也没有简单的方法来判断这样做可能会带来多少问题。(好)设计师不会在没有充分理由的情况下武断地进行弱引用。
(希望您能理解来自your last question的弱引用。)
发布于 2009-09-26 22:01:01
看起来,cursor()返回(并保持)对连接的弱引用,因此,当连接的强引用不在调用堆栈之外时,您的连接(connect()的结果)将不会有任何强引用。所以当close()被调用时,你的连接已经被破坏了。
第二种形式通过始终保持对你的连接的强引用来避免这种情况。
https://stackoverflow.com/questions/1482270
复制相似问题