Python 函数返回的对象是否导致内存泄漏
以下面的代码为例,函数返回的对象是否会导致内存泄漏 我很好奇在被函数Python 函数返回的对象是否导致内存泄漏,python,python-2.7,memory-leaks,Python,Python 2.7,Memory Leaks,以下面的代码为例,函数返回的对象是否会导致内存泄漏 我很好奇在被函数use\u age使用后,对象handle会发生什么变化 class Demo(object): def _get_mysql_handle(self): handle = MySQLdb.connect(host=self.conf["host"], port=self.conf["port"],
use\u age
使用后,对象handle
会发生什么变化
class Demo(object):
def _get_mysql_handle(self):
handle = MySQLdb.connect(host=self.conf["host"],
port=self.conf["port"],
user=self.conf["user"],
passwd=self.conf["passwd"],
db=self.conf["db"])
return handle
def use_age(self):
cursor = self._get_mysql_handle().cursor()
if __name__ == "__main__":
demo = Demo()
demo.use_age()
不,该代码不会导致内存泄漏 CPython通过引用计数来处理对象生命周期。在您的示例中,引用计数降回0,并且再次删除数据库连接对象
中的本地名称\u get\u mysql\u handle
是一个引用,当handle
返回时,它会被删除\u get\u mysql\u handle
- 保存来自
的返回值的堆栈是另一个堆栈,当表达式结果完成时,它也会被删除self.\u get\u mysql\u handle()
是一个方法,因此在该方法退出之前,它将对该方法的.cursor()
参数有另一个引用self
的返回值可能存储了一个引用,当光标本身被捕获时,它将被删除。这取决于.cursor()
方法中本地use\u age()
变量的生存期。作为本地用户,它不会超出游标
函数的范围use\u age()
在Python版本<3.4中,您确实需要注意使用自定义类创建循环引用,这些自定义类定义了
\uu del\uu
方法。这些是循环引用,不会中断。你可以在中反思这样的链。不,你为什么会这样想?想到C/C++
,很好奇python的规则是什么。那么我需要在连接上调用close还是将其留给对象析构函数呢?@loolo:对象析构函数会处理它,但是,如果您依赖于事务,您可能希望更直接地控制连接何时关闭,尤其是在您使用Jython或IronPython的情况下。以上面的代码为例,\u get\u mysql\u handle
返回的连接只使用一次,之后应该没有对该对象的引用。简言之,在这种情况下,似乎有一个隐含的结束。是真的吗?@loolo:MySQL连接对象被删除时会隐式关闭,是的。Python确保它被删除。