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