这种行为是一个奇怪的怪癖,它来自python代码的三个不同特性.非零值是真实的,逻辑运算评估和短路.我将在下面解释这些功能:
在评估这些表达式时,您必须要知道的第一件事是它们是逻辑运算符.它们旨在使用true或false值:
true and true = true
true and false = false
false and true = false
false and false = false
true or true = true
true or false = true
false or true = true
false or false = false
Run Code Online (Sandbox Code Playgroud)
但是,python(和许多语言)允许你输入任何值.只要它们非零,它们就被认为是真的.所以:
4 and 5 = true
4 and 0 = false
Run Code Online (Sandbox Code Playgroud)
到目前为止这是正常的.大多数语言都有这个.
Python在这里做了一些独特的事情.它实际上返回它在语句中检查的最后一项的值,而不是返回true或false.所以:
4 and 5 = 5 (which will be evaluated as true)
Run Code Online (Sandbox Code Playgroud)
要完全了解实际返回的值,您还必须了解:
在评估这些逻辑运算符时,编译器通常可以提前停止.举个例子:
3 or 4
Run Code Online (Sandbox Code Playgroud)
我们知道该语句将返回true,但它将返回哪个值?为了解决这个问题,你必须了解最后一个看到的值.系统将查看3,并意识到该陈述是正确的.第二个值是什么并不重要,3 or anything是真的.因此返回的值是3,因为它是最后检查的值.
但是,如果我们使用和:
3 and 4
Run Code Online (Sandbox Code Playgroud)
一旦我们看到3,我们仍然需要检查第二个值是否为真.它可能会有所作为.所以评估第二个值.如果为true,则返回查看的最后一个值,在本例中为4.
您只需要考虑解释器可以停止的值.
3 or 4 = 3 // because we can stop at 3
3 and 4 = 4 // because we have to check the 4
0 or 3 = 3 // because we needed to check the 3
Run Code Online (Sandbox Code Playgroud)