<p>既然你声称习惯了JavaScript:</p>
<p>Python<a href="http://docs.python.org/3/reference/expressions.html#in" rel="noreferrer">^{<cd1>}</a>运算符与JavaScript<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in" rel="noreferrer">^{<cd1>}</a>运算符类似。</p>
<p>下面是一些JavaScript:</p>
<pre><code>var d = {1: 2, 3: 4};
if (1 in d) {
alert('true!');
}
</code></pre>
<p>以及等效的Python:</p>
<pre><code>d = {1: 2, 3: 4}
if 1 in d:
print('true!')
</code></pre>
<p>对于objects/dict,它们几乎是相同的,都检查<code>1</code>是否是object/dict的一个键。当然,最大的区别是JavaScript是草率类型的,所以<code>'1' in d</code>也同样正确。</p>
<p>对于数组/列表,它们非常不同。JS数组是一个对象,其索引是键,因此<code>1 in [3, 4, 5]</code>将是<code>true</code>。Python列表与dict完全不同,它的<code>in</code>运算符检查的是<em>值</em>,而不是<em>索引</em>,后者往往更有用。Python将此行为扩展到所有iterable。</p>
<p>有了弦,它们就更不一样了。JS字符串不是对象,因此您将得到一个<code>TypeError</code>。但是Python<code>str</code>或<code>unicode</code>将检查另一个操作数是否是<em>子字符串</em>。(这意味着<code>1 in '123'</code>是非法的,因为<code>1</code>不能是任何子字符串,但是<code>'1' in '123'</code>是真的。)</p>
<p>对象作为对象,在JS中当然没有区别,但在Python中,对象是类的实例,而不是dict。因此,在JS中,<code>1 in d</code>对于一个名为<code>'1'</code>的成员或方法是正确的,但在Python中,这取决于您的类,它的意思是Python将调用<code>d.__contains__(1)</code>,然后,如果失败,它将尝试将您的对象用作可发出的对象(通过调用它的<code>__iter__</code>,如果失败,则尝试使用从<code>0</code>开始的整数对其进行索引)。</p>
<p>另外,请注意JS的<code>in</code>,因为它实际上是在检查对象成员身份,所以执行通常的JS方法解析顺序搜索,而Python的<code>in</code>,因为它检查dict的键、序列的成员等,所以不执行这种操作。所以,从技术上讲,它可能比<code>in</code>运算符更接近<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty" rel="noreferrer">^{<cd21>}</a>方法。</p>