当函数完成时,对象是否从内存中删除?蟒蛇

时间:2015-12-27 16:55:48

标签: python object memory

说有

class thing(object):
    def __init__(self):
        self.text = "foo"


def bar():
    obj = thing()
    #do something with the object

bar()

在bar()完成后是否从内存中删除obj,或者它是否仍在内存中,因为它是bar的局部变量而无法访问? (这假设obj不会放入全局或外部容器,例如字典或列表)。

2 个答案:

答案 0 :(得分:6)

当函数退出时,将删除对象obj引用。

这是因为CPython(默认的Python实现)使用引用计数来跟踪对象的生命周期。 obj是一个局部变量,仅在函数持续时间内存在。 thing()是仅包含一个引用obj的实例,当清除obj时,引用计数将降至0并立即删除thing()

如果您正在使用PyPy,IronPython,Jython或其他一些实现,则可以延迟对象销毁,因为实现可以自由使用不同的垃圾收集方案。这对于实现__del__方法很重要,因为它们的调用可能会延迟。

如果您想了解更多有关Python名称的工作原理,我建议您阅读优秀的Facts and myths about Python names and values

答案 1 :(得分:-1)

加入更正:

是的,当函数超出范围时,将回收引用计数为0的对象。

Python具有内置,全局(模块)范围和功能范围。

如果您有一个资源需要在作用域退出后立即释放,请将其放在with块中并放置逻辑以释放__exit__中的资源。与with块关联的变量仍然是封闭函数或模块的本地变量。

一旦超出范围就应该释放的资源的成语是with,例如

with open("frodo.txt","r") as fh:
    for line in fh:
        do_something(line)

在CPython中,在版本3.4之前,具有自定义__del__方法的对象如果涉及循环,则可能会以非确定性顺序删除。