Python语句错误If或and

2024-06-16 10:49:17 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,无论变量“msg”存储了什么,都会触发此语句。它应该只对您在代码中看到的内容做出反应。请让我知道我是否正确地写了这句话或如果我需要另一种格式。谢谢你

if (username == "ssj3goku878") or (username == "mgnlive") and msg == "!load": 
     keyholder.holdForSeconds("F7", 1);
if (username == "ssj3goku878") or (username == "mgnlive") and msg == "!save": 
     keyholder.holdForSeconds("F8", 1);

Tags: orand代码内容if格式usernameload
3条回答

你需要另一组括号,即

((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load": 

由于operator precedenceor的绑定优先级低于{}。例如,与您类似的表达式是:

a or b and c

如括号所示:

^{pr2}$

因为and具有更高的优先级。在这种情况下,如果a为真,则表达式将始终为True,而子表达式(b and c)将不被计算。因此,子表达式的计算结果没有任何区别,因此更改c的值不会影响结果(当a为真时为N.B)。在

因此,对于您的表达式,每当username == "ssj3goku878"为真时,msg的值与整个结果没有关系,您将发现这两个if语句都执行它们的主体。在

若要更正此问题,应显式添加括号以覆盖默认引用:

if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load": 
     keyholder.holdForSeconds("F7", 1)

您可能有2个以上的用户,并且不希望在添加新用户时更改程序,因此最好这样做:

users = ["ssj3goku878", "mgnlive", "user3"]
if username in users and msg == '!load':
    keyholder.holdForSeconds("F7", 1)

users列表可以从文件、数据库或其他持久源填充。在这种情况下,in的优先级高于and,因此不需要括号,但是显式地添加括号通常比您(或任何正在阅读代码的人)记住(或查找)先例要容易得多,因此这通常更好:

if (username in users) and msg == '!load':

Python在or运算符之前计算and运算符(除非它们在括号中)。因此,如果你想用你想要的方式来评估逻辑,你应该加上括号,例如:

if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load":
     keyholder.holdForSeconds("F7", 1);

有关这些操作员工作的更多信息,请访问: https://docs.python.org/2/library/stdtypes.html#boolean-operations-and-or-not

相关问题 更多 >