python中的if命令

python中的if命令,python,Python,我有这样一个代码,检查attrs[“show”]是否包含这两个字符串中的任何一个,然后给self.xx赋值 但这个“如果”命令正确吗?因为从我的结果来看,如果命令始终为真(这是不可能的)请尝试以下操作: if "aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]: self.xx = xxxx 您当前的if语句将始终计算为True,因为您不是在检查每个字符串是否在attrs[“show”]中,而是在检查“aa”是否为

我有这样一个代码,检查attrs[“show”]是否包含这两个字符串中的任何一个,然后给self.xx赋值

但这个“如果”命令正确吗?因为从我的结果来看,如果命令始终为真(这是不可能的)

请尝试以下操作:

if "aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]:
    self.xx = xxxx
您当前的if语句将始终计算为
True
,因为您不是在检查每个字符串是否在
attrs[“show”]
中,而是在检查
“aa”
是否为True,或者
“bb”
是否为True,等等。由于
“aa”
在布尔上下文中的计算结果始终为True,因此您将始终输入
if
子句

相反,使用我的示例中的函数,该函数接受iterable,如果其任何元素为True,则返回True。类似于代码中的一堆
,一旦找到正确的元素,它就会短路。在本例中,上述代码相当于以下代码(但要简洁得多!):


您的
IF
语句没有测试任何内容。由于它的书写方式,它将始终被评估为真

你在问python:

if ("aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] or
    "dd" in attrs["show"] or "ee" in attrs["show"] or "ff" in attrs["show"]):
    self.xx = xxxx
Python说“是的,”aa“是真的,因为它在那里!”

更正if语句或找到更好的方法来查找列表中的值:

Is aa true
Is bb true
...

在Python中,
计算为其第一个
操作数(因为
或与任何内容相关的值都是
,Python不需要比第一个操作数看得更远)

因此:

。。。评估结果为:

"aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]
这是
True
,因为它是非空字符串。该行的其余部分甚至没有考虑,因为它不需要考虑

所以您的
if
语句总是执行,因为它总是
True

您想要的是:

"aa"
这会变得非常冗长,因此您可以使用
any
和生成器表达式更简洁地编写它

"aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] ...

对于这里的列表,集合比元组更合适,因为在集合上,成员身份是O(1)而不是O(n)。@Lattyware-不,实际上将其更改为集合不会有什么区别,因为我们正在测试
attrs[“show”]
(可能已经是一个集合)中的成员身份,而不是我定义的用于在字符串上循环的元组中的成员身份。唯一的变化是您可以按不同的顺序检查字符串。您的第一部分是正确的。但是attrs[“show”]
中的
if(“aa”或“bb”…)等同于attrs[“show”]
中的
if“aa”或“bb”…,所以这不是您的意图。您的“corrected”
if
语句总是在
attrs[“show”]
中查找
,并且您的第二个示例在逻辑上是向后的。@rubik您介意澄清一下吗?我贴出的答案是基于问题海报所提供的信息的解决方案。我无法创建比给出的信息更多的信息。@kindall基于提出的问题,我的第一个示例给出了预期的输出<代码>检查属性[“显示”]是否包含这些字符串之一
。第一个示例将输入
if
块,如果任何值位于
attrs[“show”]
中。不,它不在
中的代码>(“aa”或“bb”或“cc”或“dd”或“ee”或“ff”)与ATTR[“显示”]
中的
“aa”相同。
"aa"
"aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] ...
any(s in attrs["show"] for s in ["aa", "bb", "cc", "dd", "ee", "ff"])