擅长:python、mysql、java
<p>我无法回答原因;但绝对应该有一个,这样就可以用同一个接口清除不同类型的对象。</p>
<p>一个显而易见的简单例子:</p>
<pre><code>def process_and_clear_requests(reqs):
for r in reqs:
do_req(r)
reqs.clear()
</code></pre>
<p>这只需要对象支持迭代,并且它支持clear()。如果lists有一个clear()方法,那么它可以接受一个list或设置相等的值。相反,由于集合和列表有不同的API来删除它们的内容,这是行不通的;您最终会遇到一个不必要的丑陋的黑客攻击,比如:</p>
<pre><code>def process_and_clear_requests(reqs):
for r in reqs:
do_req(r)
if getattr(reqs, "clear"):
reqs.clear()
else:
del reqs[:]
</code></pre>
<p>就我而言,使用del obj[:]或obj[:]=[]只是不愉快的,不直观的黑客来解决列表缺少clear()这一事实。</p>
<p>这就把“减少冗余”变成了一个错误,它破坏了语言的<em>一致性</em>,这一点更为重要。</p>
<p>至于你该用哪种,我建议用del obj[:]。我认为对于非列表类对象更容易实现。</p>