python“in”语句会自动返回true

时间:2013-03-22 05:48:15

标签: python python-2.7

我在学习如何使用in语句来使if语句更好地工作的过程中编写了一些不必要的复杂代码。我在代码片段后面有两个问题。

answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
for i in range(0, 3):
    if ans in answer[i]:
        print "Yes!"
    elif ans in answer2[i]:
        print "No!"
    else:
        print "Don't know what that means"

第一个问题:我认为if n in listname:会自动返回True或False。有谁知道是否是这种情况?

第二个问题:上面的代码会返回3行,具体取决于ans实际上是answer还是answer2。我试图通过替换相关部分来消除这种情况:

if ans in answer[i] == True:

这产生了使代码仅输出else:语句的奇怪效果。那么有人可以向我解释python如何解释if ans in answer[i]:if ans in answer[i] == True:之间的区别吗?

2 个答案:

答案 0 :(得分:15)

要以相反的顺序回答您的问题,明确与True进行比较的原因并不适合您,因为Python没有按照您的预期解释表达式。 Python解析器对比较表达式进行了特殊处理,以便您可以将它们链接在一起并获得合理的结果,如下所示:

>>> "a" == "a" == "a"
True

请注意,Python必须将整个事件视为一个操作,因为如果将它拆分为两个操作,则无法获得相同的结果:

>>> ("a" == "a") == "a"
False
>>> "a" == ("a" == "a")
False

这些行为有所不同,因为括号中的部分首先被计算并返回True,但是True != "a"所以整个表达式返回false。

根据权利,上述内容实际上根本不会对您的程序产生任何影响。不幸的是,Python通过与in相同的机制处理==,所以当你将它们链接在一起时,它们被解释为如上所述的序列,因此Python实际上按如下方式对其进行评估:

>> "a" in ["a"] == True
False
>>> ("a" in ["a"]) and ("a" == True)
False

这是古怪的,可以说是反直觉的,但遗憾的是它的运作方式。要获得您想要的行为,您需要使用括号来强制Python分别评估第一部分:

>>> ("a" in ["a"]) == True
True

如上所述,== True是多余的,因为正如您所怀疑的那样,表达式已经返回一个布尔值,而if语句只能按原样评估它。

现在回到你的另一个问题,我相信你要做的是取一行输入并根据用户输入的内容产生一行相应的输出。您可以将in运算符应用于字符串和列表,以查看该字符串是否在列表中,这样您就可以完全取消for循环:

answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
if ans in answer:
    print "Yes!"
elif ans in answer2:
    print "No!"
else:
    print "Don't know what that means"

首先测试输入是否匹配answer中的任何字符串,然后匹配answer2的相同字符串。当然,您可以通过简单地将输入转换为小写并将其与小写形式进行比较来实现类似的效果,但也支持其他形式,如YeS

if ans.lower() == "yes":
    print "Yes!"
# (and so forth)

答案 1 :(得分:5)

ans in answer[i]ans in answer[i] == True之间的差异而言,简单:Python将后一种形式扩展为ans in answer[i] and answer[i] == True,当然,这是假的,因为字符串不等于True

一个更简单的例子可能有助于说明这一点:

>>> a = [1, 2, 3]
>>> 2 in a
True
>>> 2 in a == True
False
>>> 2 in a and a == True
False
>>> (2 in a) == True
True
>>> 2 in a == [1, 2, 3]
True
>>> 2 in a and a == [1, 2, 3]
True

请注意添加括号如何更改行为 - 这类似于1 < x < 5等扩展,而不是(1 < x) < 5

作为旁注,通常认为显式检查TrueFalse的风格很差 - 只需编写if x in y就好了。