假设我做了类似的事情:
retVal = MyClass().MyClassFunc()
等效的In C ++将创建一个临时的MyClass
实例,一旦MyClassFunc
函数返回就会被销毁。
现在,如果MyClassFunc
函数返回对MyClass
类的某个非静态成员变量的引用,则此代码通常不安全。
我的问题是这段代码在Python中是否安全。
更具体地说,我对以下方面的安全感兴趣:
db = MongoClient(uri).get_database(db_name)
但我当然正在寻找一般答案。
答案 0 :(得分:3)
简短回答:这是安全的(考虑到你对垃圾收集的担心)。
现在,如果MyClassFunc函数返回对
MyClass
类的某个非静态成员变量的引用,那么此代码通常是不安全的。
我假设您担心自从您在堆栈上分配了MyClass
对象后,一旦从该方法返回,它将被删除。
在Python中,概念在堆栈中不存在堆。您分配对象,Python虚拟机应该处理它们 - 只要它们是活动的 - 垃圾收集器不会收集它们。
因此,如果您返回对MyClass
对象成员的引用,那么至少该成员仍将处于活动状态。如果该成员是非静态方法,它通常会引用该对象,因此MyClass
对象也将存活。
在Python中,垃圾收集是以透明的方式完成的,比如C#等。所以你不必担心内存管理:你可以假设如果你引用一个对象,它总是会活着。
例如,人们有时可以找到以下内容:
getter = {'a': 1, 'b': 4, 'c': 2, 'd': 5}.get
所以这里我们获得了对该词典的get
方法的引用。我们不能再引用原始字典,但在内部,.get
方法将使字典保持活动状态。