擅长:python、mysql、java
<blockquote>
<p>Will in stop a search from alist at ele3 ?</p>
</blockquote>
<p>是的,列表上的<em>in</em>运算符执行线性搜索,如果找到目标,则使用<strong>提前退出</strong>。另外,如果目标对象与列表中的对象相同,它将跳过最终的比较。在</p>
<p>下面是一些跟踪代码,通过使比较可见来证明结果:</p>
<pre><code>class Int(int):
'Make comparisons visible'
def __cmp__(self, other):
print 'Comparing %s to %d' % (self, other)
return int.__cmp__(self, other)
ele1 = Int(1)
ele2 = Int(2)
ele3 = Int(3)
ele4 = Int(4)
ele5 = Int(5)
alist = [ele1, ele2, ele3, ele4, ele5]
if ele3 in alist:
print "found"
</code></pre>
<p>输出为:</p>
^{pr2}$
<p>Python将表达式<code>ele3 in alist</code>中的<em>in</em>运算符转换为<a href="https://docs.python.org/2.7/reference/expressions.html#not-in">magic method call</a>,例如<code>alist.__contains__(ele3)</code>。<a href="http://hg.python.org/cpython/file/17e1af9ad66c/Objects/listobject.c#l437"><em>list.__contains__()</em></a>方法的工作原理如下:</p>
<pre><code>def __contains__(self, target):
for element in self:
if target is element or target == element:
return True
return False
</code></pre>
<p>希望这能让整个过程清晰明了:-)</p>