python中的逻辑运算符“和”

时间:2014-01-27 09:52:36

标签: python

为什么自我两次?我无法找到该线的逻辑。有人可以帮我这个吗?

return (self.year and self.year == date.year or True)

我正在经历http://www.openp2p.com/pub/a/python/2004/12/02/tdd_pyunit.html并遇到了这一行...当然,我理解并且,或者,xor,xnor或任何布尔表达式都没有问题。但我对它在这里使用的方式感到困惑。

: - )

4 个答案:

答案 0 :(得分:2)

return (self.year and self.year == date.year or True)

在这种情况下,首先在self.year上存在检查,如果它不存在,它将返回(我假设)None(在python == False中)。之后将其与date.year

进行比较

我认为这有点多余,因为如果self.year不存在,那么比较将会返回false。

正如Bereal在你的问题上评论的那样,最后or True确实很奇怪,因为这似乎导致总表达总是返回True

一般注意:在python中,布尔表达式总是按照“外观顺序”进行评估。

答案 1 :(得分:1)

评估顺序很重要(见here)。代码:

return self.year and self.year == date.year

可以改写:

return self.year and (self.year == date.year)

或者,完整:

if self.year:
    if self.year == date.year:
        return True
    else:
        return False
return False # Actually return self.year, but usually a boolean is intended in this sort of situation

但是,由于最后的True,您发布的表达式始终会评估为or True。使用括号显示评估顺序:

return (self.year and (self.year == date.year)) or True

答案 2 :(得分:1)

此行将始终返回true,因为您正在使用具有真值的or

除此之外,首先检查self.yearNone还是False,而不是检查self.year是否等于date.year

答案 3 :(得分:1)

return (self.year and self.year == date.year or True)
是的,需要两次包括self.year。因为它将检查是否存在self.year定义的东西,如果它没有定义,它将给出一个错误,即没有像“self.year”这样的东西,即它是未定义的。因为它认可self.year是定义的东西,而不是它将检查它的价值。