Python 使用听写或集合的清晰方法是否有性能优势?

Python 使用听写或集合的清晰方法是否有性能优势?,python,Python,我刚刚发现Python字典和集合中都有一个clear方法。该方法实际上只是从对象中删除所有条目 调用foo.clear()而不是foo={},或者foo=set(),是否有一个很好的理由,或者甚至在某种情况下是有意义的 我可以想象它可能更有效地用于垃圾收集,但它似乎违反了“应该有一种——最好只有一种——显而易见的方法来实现它。”可能还有其他对该对象的引用。如果用新对象替换引用,其他引用仍将指向原始字典/集合。foo={}不删除该对象,只将foo引用到新的空对象(如果其他变量仍引用它,则旧对象仍将

我刚刚发现Python字典和集合中都有一个
clear
方法。该方法实际上只是从对象中删除所有条目

调用
foo.clear()
而不是
foo={}
,或者
foo=set()
,是否有一个很好的理由,或者甚至在某种情况下是有意义的


我可以想象它可能更有效地用于垃圾收集,但它似乎违反了“应该有一种——最好只有一种——显而易见的方法来实现它。”

可能还有其他对该对象的引用。如果用新对象替换引用,其他引用仍将指向原始字典/集合。

foo={}不删除该对象,只将foo引用到新的空对象(如果其他变量仍引用它,则旧对象仍将保留)。

因此,foo.clear()是内存有效的,这是最好的方法。

当对同一集合对象有多个引用时,只有
clear()
可以清空集合而无需重新分配

比较:

>>> def clear(s):
...     s.clear()
...
>>> def clear_assignment(s):
...     s = set()
...
>>> foo = {'bar', 'baz'}
>>> clear_assignment(foo)
>>> foo
{'baz', 'bar'}
>>> clear(foo)
>>> foo
set()

赋值将一个名称重新绑定到一个新的
set()
对象,而
set.clear()
无需重新赋值即可删除可变对象中的所有内容,因此您可以继续使用对该集合的其他引用。

Doing
foo={}
foo.clear()
并不等效。一个将
foo
分配给一个新对象,另一个清除现有对象中的条目。这不会违反“一种明显的方式”,因为它们执行不同的操作。您可能希望继续使用同一个set对象。如果有多个变量引用同一个字典,该怎么办
foo={}
只会更新一个变量。啊,现在看来这很明显。部分问题是关于垃圾收集的。我假设这不会立即释放内存(或者通过
gc.collect()
),与重新分配到空字典没有任何区别?@roganjosh:Python使用引用计数;当对象的引用计数降至0时,对象将立即被删除。垃圾收集器只是用来中断循环的。使用
set.clear()。即使我在完成后针对该键指定了一个值
,也无法释放原始对象的内存。所以从这个意义上说,
clear()
不会有帮助,因为我理解你的答案。@roganjosh:不,clear不会有帮助;你在其他地方还有其他的引用。只有当有另一个引用的时候,旧的仍然保留着,否则它不会被垃圾收集吗?是的,我忘了提。如果它没有被其他变量引用,那么它就是垃圾!我会更新我的答案,谢谢!