if "aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]:
self.xx = xxxx
我有这样一段代码,用于检查attrs["show"]是否包含以下任意一个字符串,如果是,则给self.xx赋值。
但是这个“IF”命令正确吗?因为从我的结果来看,似乎这个if命令总是为真(这是不可能的)。
if "aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]:
self.xx = xxxx
我有这样一段代码,用于检查attrs["show"]是否包含以下任意一个字符串,如果是,则给self.xx赋值。
但是这个“IF”命令正确吗?因为从我的结果来看,似乎这个if命令总是为真(这是不可能的)。
请尝试以下操作:
if any(s in attrs["show"] for s in ("aa", "bb", "cc", "dd", "ee", "ff")):
self.xx = xxxx
您当前的 if 语句将始终评估为 True
,因为您检查的不是每个字符串是否在 attrs["show"]
中,而是检查"aa"
是否为 True,或者"bb"
是否为 True等等。由于在布尔上下文中"aa"
将始终计算为 True,因此您将始终进入if
子句。
相反,像我的示例一样使用any()
函数,它接受可迭代对象并在其任何元素为True时返回True。类似于代码中的一堆or
,该方法在找到首个为 True 的元素后立即停止运行。在此示例中,上述代码等效于以下内容(但更加简洁!):
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
or
会返回第一个为True
的操作数(因为True
与任何操作数做或运算都为True
,所以Python不需要再查找其它操作数)。因此:"aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]
...的结果是:
"aa"
这是正确的,因为它是一个非空字符串。余下的内容甚至都不需要考虑。
所以你的if
语句总是会执行,因为它总是True
。
你需要的是像这样的:
"aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] ...
这段文字很啰嗦,所以你可以使用any
和生成器表达式来更简洁地编写它。
any(s in attrs["show"] for s in ["aa", "bb", "cc", "dd", "ee", "ff"])
IF
语句没有测试任何内容。由于它的书写方式,它将始终评估为true。Is aa true
Is bb true
...
Python说“是的,'aa'是真的,因为它在那里!”
更正你的if语句或找到更好的方法来查找列表中的值:
any(x in ['aa','bb','cc','dd','ee','ff'] for x in attrs["show"])
if ("aa" or "bb" ...) in attrs["show"]
等同于 if "aa" in attrs["show"]
,所以不是你想要的。 - Mikelif
语句总是在attrs["show"]
中寻找“aa”,而你的第二个例子逻辑上是反向的。 - kindall("aa" or "bb" or "cc" or "dd" or "ee" or "ff") in attrs["show"]
与"aa" in attrs["show"]
是不同的。 - kindallattrs[show]
的每个字符是否在列表['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
中。由于列表项都是两个字符,因此这总是False
。 - kindall
attrs["show"]
中的成员资格(它可能已经是一个集合),而不是在我定义用于循环遍历字符串的元组中。唯一的变化是您可能以不同的顺序检查字符串。 - Andrew Clark