python 中的分离和成员资格

Disjunction and membership in python

我环顾四周没能找到这个问题的答案,所以我放弃了,做了一个post。

我一直在寻找关于以下执行中发生的事情的解释:

a = ['b']

if 'i' or 'j' in a:
    print('Yes!')
else:
    print('No!')

输出为'Yes!'。 Flake8 和 python 不会抱怨错误或错误的形式。

执行过程中发生了什么导致 if 语句的值为 True?有没有人可以给我提供一些参考?

此致, 尼尔斯

问题在于语句 i 的计算结果为 True,这意味着语句为:True or 'j' in a。这始终是正确的,您的结果将始终是 'Yes!'.

您可以使用类似这样的方法来检查列表中是否有一个值:

a = ['b']
chars_to_check = ['i', 'j']

filtered_list = [i for i in a if i in chars_to_check]

if len(filtered_list)>0:
    print('Yes!')
else:
    print('No!')

示例来自 this question,人们还发布了针对您的问题的更有效或更短的解决方案。我最喜欢的解决方案是这个:

a = ['b']
if {'i','j'} & set(a):
    print('Yes!')
else:
    print('No!')

编辑:我想现在我明白了这个问题。

首先,python 发现您的 if 语句中有一个 or。这意味着首先评估第一个表达式(在您的情况下为 'i')。如果第一个表达式是 True,则整个语句是 True,甚至不计算第二个表达式。 or的求值顺序以here为例进行说明。

现在解释为什么第一个表达式总是 True。 Python 自动评估所有对象,而不仅仅是 boolean 值。为此,对象可以包含一个函数 __bool__(),返回对象的 boolean 值。您的对象是单个字符 'i',计算结果为 True。原因是定义了字符串的布尔值总是True,除了空字符串('')。在这里你可以看到评估的例子:

print(bool('i')) # True
print(bool('')) # False

显示哪些对象被视为 False 以及哪些被视为 True 的答案,您能找到 .