<p>您应该使用<code>and</code>而不是<code>&</code>。<code>&</code>为<em>位and</em>,其结合力强于<code>==</code>,而<code>and</code>为<em>逻辑and</em>,其结合力弱于<code>==</code>。你知道吗</p>
<pre><code>>>> a, b = 0, 1
>>> a == 0 and b == 1
True
>>> a == 0 & b == 1
False
</code></pre>
<p>后一个例子对应于您的<code>if</code>语句,它被解析为<code>a == (0 & 1) == 1</code>,即<code>0 == 0 == 1</code>(通过Python比较链,它不是</em><code>(0 == 0) == 1</code>,它将计算为<code>True</code>,而是<code>(0 == 0) and (0 == 1)</code>)。你知道吗</p>
<p>对于<code>a == 1 & b == 1</code>来说,这不是问题,但在所有其他情况下,它的行为都会出人意料。你知道吗</p>
<pre><code>>>> cases = [(0, 0), (0, 1), (1, 0), (1, 1)]
>>> [a == 0 & b == 0 for a, b in cases] # should be [True, False, False, False]
[True, True, False, False] # but evaluates as "a == 0 == 0"
>>> [a == 0 & b == 1 for a, b in cases] # should be [False, True, False, False]
[False, False, False, False] # but evaluates as "a == 0 == 1"
>>> [a == 1 & b == 0 for a, b in cases] # should be [False, False, True, False]
[True, False, False, False] # but evaluates as "a == b == 0"
>>> [a == 1 & b == 1 for a, b in cases] # should be [False, False, False, True]
[False, False, False, True] # evaluates as "a == b == 1" ("correct")
</code></pre>