<p>由于<a href="https://docs.python.org/2.7/reference/expressions.html#operator-precedence" rel="nofollow">operator precedence</a>,<code>or</code>的绑定优先级低于{<cd2>}。例如,与您类似的表达式是:</p>
<pre><code>a or b and c
</code></pre>
<p>如括号所示:</p>
^{pr2}$
<p>因为<code>and</code>具有更高的优先级。在这种情况下,如果<code>a</code>为真,则表达式将始终为True,而子表达式<code>(b and c)</code>将不被计算。因此,子表达式的计算结果没有任何区别,因此更改<code>c</code>的值不会影响结果(当<code>a</code>为真时为N.B)。在</p>
<p>因此,对于您的表达式,每当<code>username == "ssj3goku878"</code>为真时,<code>msg</code>的值与整个结果没有关系,您将发现这两个if语句都执行它们的主体。在</p>
<p>若要更正此问题,应显式添加括号以覆盖默认引用:</p>
<pre><code>if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load":
keyholder.holdForSeconds("F7", 1)
</code></pre>
<hr/>
<p>您可能有2个以上的用户,并且不希望在添加新用户时更改程序,因此最好这样做:</p>
<pre><code>users = ["ssj3goku878", "mgnlive", "user3"]
if username in users and msg == '!load':
keyholder.holdForSeconds("F7", 1)
</code></pre>
<p><code>users</code>列表可以从文件、数据库或其他持久源填充。在这种情况下,<code>in</code>的优先级高于<code>and</code>,因此不需要括号,但是显式地添加括号通常比您(或任何正在阅读代码的人)记住(或查找)先例要容易得多,因此这通常更好:</p>
<pre><code>if (username in users) and msg == '!load':
</code></pre>