如果语句检查列表包含在不应该返回时返回true

时间:2015-08-03 06:28:23

标签: python list if-statement

我有一个包含值的列表:

['1', '3', '4', '4']

我有一个if语句,它将检查列表中是否包含这些值,然后输出一个语句:

if "1" and "2" and "3" in columns:
    print "1, 2 and 3"

考虑到列表不包含值“2”,它不应该打印语句,但它是:

输出:

1, 2 and 3

有人可以解释为什么会这样吗?这是Python读取列表的方式吗?

2 个答案:

答案 0 :(得分:35)

operator precedence

的顺序进行评估
if "1" and "2" and ("3" in columns):

扩展为:

if "1" and "2" and True:

然后评估("1" and "2")给我们留下:

if "2" and True

最后:

if True:

相反,您可以检查set字符串是columns的子集:

if {"1", "2", "3"}.issubset(columns):
    print "1, 2 and 3"

答案 1 :(得分:11)

为了理解正在发生的事情,要记住两条一般规则:

在评估表达式"1" and "2" and "3" in columns时,order of operator precedence会将其评估为"1" and "2" and ("3" in columns)。因此,"1" and "2" and True确实是"3"的一个元素(注意单引号或双引号对于python字符串是可互换的)。

  

同一个框组中的操作员从左到右

由于我们有两个具有相同优先级的运算符,因此评估为columns

对于("1" and "2") and Truedocumentation for boolean operations states

  

表达式x和y首先计算x;如果x为假,则其值为   回;否则,评估y并得到结果值   返回。

因此,and评估为("1" and "2") and True,然后评估为"2" and True。因此,True正文始终执行。