假设脚本中没有任何特定的内存优化问题,所以我的问题是关于Python编码风格。这也意味着:尽可能快地取消引用对象是一种很好的常见python实践吗?场景如下。
Class A
将对象实例化为self.foo
,并要求第二个class B
存储并与其他对象共享。
在某个时间点A
决定不再共享self.foo
并将其从B
中删除。
Class A
仍然引用了foo,但我们知道这个对象从现在开始没用。
由于foo是一个相对较大的对象,你是否还想从A中删除引用以及如何删除?(例如del
vs设置self.foo = None
)此决定如何影响垃圾收集器?
答案 0 :(得分:5)
如果在删除属性后,访问属性并查看其是否设置的概念甚至没有意义,请使用del
。如果在删除属性后,程序中的某些内容可能需要检查该空格并查看其中是否存在任何内容,请使用= None
。
垃圾收集者不管怎样都不在乎。
答案 1 :(得分:1)
del Blah
将Blah的引用计数减少一个......一旦没有更多引用,python将垃圾收集它
self.foo = None
也会将Blah的引用数量减少一个......一旦没有更多的引用,python会垃圾收集它
这两种方法都没有实际强制对象被销毁......只有一个对它的引用
*
作为一般经验法则我会避免使用 del
,因为它会破坏名称,并且如果您尝试在之后引用它,可能会导致代码中的其他错误... < / em>的
在cPython中(&#34;普通&#34; python)这个垃圾收集非常频繁地发生
答案 2 :(得分:1)
到目前为止,根据我使用Python的经验,我对垃圾收集没有任何问题。但是,我确实采取了预防措施,不仅因为我不想打扰任何未引用的对象,而且还出于组织原因。
具体回答您的问题:
1)是的,我建议删除该对象。这将使您的代码变得笨重和/或变慢。如果你的代码有很长的运行时间,这是一个特别好的决定,即使Python非常适合垃圾收集。
2)无论哪种方式都可以,但我只是为了删除实际的引用本身而使用del
。
3)我不知道它是如何“影响垃圾收集器的”但是安全总比抱歉好。