我有一个包含值的列表:
['1', '3', '4', '4']
我有一个if语句,它将检查列表中是否包含这些值,然后输出一个语句:
if "1" and "2" and "3" in columns:
print "1, 2 and 3"
考虑到列表不包含值“2”,它不应该打印语句,但它是:
输出:
1, 2 and 3
有人可以解释为什么会这样吗?这是Python读取列表的方式吗?
答案 0 :(得分:35)
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 True
,documentation for boolean operations states:
表达式x和y首先计算x;如果x为假,则其值为 回;否则,评估y并得到结果值 返回。
因此,and
评估为("1" and "2") and True
,然后评估为"2" and True
。因此,True
正文始终执行。