为什么此Python语句中的“和/或”操作行为异常?

时间:2019-02-22 07:11:16

标签: python logical-operators

我有一个关于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:,但是当我打印列表时,我得到的是 output#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

我看到了外观类似的解决方案here,但它不能完全解决我的问题。两次都得到了使用andor时无法预期的结果。为什么在这两个操作中都会发生这种情况?

2 个答案:

答案 0 :(得分:16)

("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

答案 1 :(得分:6)

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