为什么此 Python 语句中的"and/or"操作行为异常?



我有一个关于python的概念问题。这是代码

list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=[]
for item in list1:
    if (sub1 and sub2) in item:
        ans.append(item)

在这里,我希望列表为空,因为这些项目都不满足条件if sub1 and sub2 in item:,但是当我打印列表时,我会得到输出#1 ,因为此

>>> ans
['salesperson', 'sales manager'] # I expected an empty list here

另外,当我使用or而不是and时,如下

for item in list1:
    if (sub1 or sub2) in item:
        ans.append(item)

输出#2 我得到的是

>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings

我在这里看到了类似的解决方案,但这并不能完全解决我的问题。两次我都会获得一个结果,我期望使用andor。为什么这两个操作都会发生?

("teacher" and "sales") in "salesmanager"在python和英语中并不相同。

在英语中,它对("teacher" in "salesmanager") and ("sales" in "salesmanager")是同义词(Python会根据您的想象理解,并评估False)。

另一方面,

Python将首先评估"teacher" and "sales",因为它在括号中,因此具有更高的优先级。and如果虚假,则将返回第一个参数,否则第二个参数。"teacher"不是虚假的,因此"teacher" and "sales"评估为"sales"。然后,Python继续评估"sales" in "salesmanager",并返回True

andor操作员不做您认为他们做的事情。尝试分解您的表达方式:

if sub1 in item or sub2 in item:
if sub1 in item and sub2 in item:

and操作员评估其左手操作数,如果结果是真实的,则返回右手操作数,否则左手操作。

or操作员评估其左手操作数,如果结果是虚假的,则返回右手操作数,否则左手操作数。

因此,在您的第一个表达式中,评估如下:

(sub1 and sub2) in item
("teacher" and "sales") in item
("sales") in item

这不是您所期望的。

与您的第二个表达式类似:

(sub1 or sub2) in item
("teacher" or "sales") in item
("teacher") in item

相关内容

  • 没有找到相关文章

最新更新