【问题标题】:If statement check list contains is returning true when it shouldn't如果语句检查列表包含在不应该返回 true 时
【发布时间】:2015-10-25 04:05:12
【问题描述】:

我有一个包含值的列表:

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

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

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

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

输出:

1, 2 and 3

有人可以解释为什么会这样吗?是 Python 读取列表的方式导致了这种情况发生吗?

【问题讨论】:

  • in 优先于 and。如有疑问,请添加括号。

标签: python list if-statement


【解决方案1】:

它按照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" and "2" and "3"返回"3""3" in columns返回True。这是因为“andor 都不限制它们返回的值和类型为 False 和 True,而是返回最后评估的参数”。 see the docs :)
  • @elegent 啊,你当然是对的。我只是在考虑“真实性”,但你所说的是实际发生的事情。
  • 就目前而言,这种解释是错误的,原因很优雅。考虑到它是最高投票和接受的答案,请花时间纠正它,否则我们会误导人们。如果你不介意,我很乐意这样做
  • 对不起! 我的解释也错了!!请看@goncalopp answer
  • 大家的敬业精神给我留下了深刻的印象,我已经相应地更新了答案。
【解决方案2】:

要了解正在发生的事情,请牢记两条一般规则:

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

同一框组中的运算符从左到右

由于我们有两个具有相同优先级的运算符,因此计算结果为 ("1" and "2") and True

对于anddocumentation for boolean operations states

表达式 x 和 y 首先计算 x;如果 x 为假,则其值为 回来;否则,对 y 求值,结果值为 返回。

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

【讨论】:

  • 是的 :) 我们走了 :D 我应该删除我的答案吗? :)
  • @elegent 我认为你不应该删除你的答案——既然你已经更正了运算符的优先级,我认为对于已经对 python 有很好理解的人来说这是最快的理解跨度>
  • 谢谢 :) 我会链接到你的答案!如果您不介意,您可以投票赞成我对@KitSunde 回答的最后一条评论,这表示我的第一条评论是错误的——所以每个人都可以立即看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多