说有
class thing(object):
def __init__(self):
self.text = "foo"
def bar():
obj = thing()
#do something with the object
bar()
在bar()完成后是否从内存中删除obj,或者它是否仍在内存中,因为它是bar的局部变量而无法访问? (这假设obj不会放入全局或外部容器,例如字典或列表)。
答案 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__
方法的对象如果涉及循环,则可能会以非确定性顺序删除。