Python语句错误如果或和

时间:2015-07-20 03:17:50

标签: python if-statement

由于某种原因,无论变量“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);

3 个答案:

答案 0 :(得分:6)

你需要另一组括号,即

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

答案 1 :(得分:4)

由于operator precedence or的绑定优先级低于and。例如,与您的表达方式相似的是:

a or b and c

解释如括号所示:

a or (b and c)

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

因此,对于您的表达式,只要username == "ssj3goku878"为True,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':

答案 2 :(得分:1)

Python之前或运算符评估和运算符(除非它们在括号中)。因此,如果您希望按照预期的方式评估逻辑,则应添加括号,例如:

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