我正在学习 Python,刚开始学习布尔条件语句。
但是我对于“如果不”的具体主题感到非常困惑。请问有人能够解释一下以下两种情况之间的区别:
x = False
if not x:
print("hello")
if x == False:
print("hello")
在Python编译器上测试此代码时,我会收到两次“hello”的输出。可以假设这意味着它们在计算机中有相同的含义。
请问为什么要使用其中一种方法而不是另一种方法?
我正在学习 Python,刚开始学习布尔条件语句。
但是我对于“如果不”的具体主题感到非常困惑。请问有人能够解释一下以下两种情况之间的区别:
x = False
if not x:
print("hello")
if x == False:
print("hello")
这得看情况™。Python 不知道其运算符应该做什么,它会在对象上调用魔术方法并让它们自己决定。我们可以通过一个简单的测试来证明这一点。
class Foo:
"""Demonstrates the difference between a boolean and equality test
by overriding the operations that implement them."""
def __bool__(self):
print("bool")
return True
def __eq__(self, other):
print("eq", repr(other))
return True
x = Foo()
print("This is a boolean operation without an additional parameter")
if not x:
print("one")
print("This is an equality operation with a parameter")
if x == False:
print("two")
生产
This is a boolean operation without an additional parameter
bool
This is an equality operation with a parameter
eq False
two
__bool__
进行布尔测试,在第二个情况下,通过调用__eq__
进行等式测试。这意味着什么取决于类。通常很明显,但像pandas这样的东西可能会变得棘手。not x
比x == False
更快,因为__eq__
运算符通常在确定之前会执行第二次布尔比较。在您的情况下,当x = False
时,您正在处理用C编写的内置类,其两个操作将类似。但是,x == False
比较需要对另一侧进行类型检查,因此会稍微慢一些。Foo
是一个类,它重写了你的测试中使用的魔术方法。这变得更加复杂,因为Python还为没有给定魔术方法的类制定了回退规则。默认的object
对象实现了默认的魔术方法,大多数派生对象实际上并没有重新实现它们自己。 - tdelaney这里已经有几个很好的答案了,但没有讨论Python中“真值”和“假值”表达式的一般概念。
在Python中,“真值”表达式是指转换为bool
时返回True
的表达式,“假值”表达式是指转换为bool
时返回False
的表达式。(参考:Trey Hunner的正则表达式教程;我与Hunner无关,我只是喜欢他的教程。)
重要的是,0
、0.0
、[]
、None
和False
都是假值。
当在if
语句中使用时,它们将不通过测试,在if not
语句中它们将通过测试。
非零数字、非空列表、许多对象(但请参阅@tdelaney的答案以获取更多详细信息),以及True
都是真值,因此它们通过if
测试并失败if not
测试。
当您使用相等性测试时,您不是在询问表达式的真实性,而是在询问它是否等于您提供的其他事物,这比一般的真实性或虚假性要严格得多。
以下是有关Python中“Truthy”和“Falsy”值的更多参考资料:
在一个情况下,你正在检查是否等于值"False",而在另一个情况下,你正在对变量执行布尔测试。在Python中,有几个变量可以通过 "if not x" 测试,但只有 x = False 可以通过 "if x == False" 测试。
请参考以下示例代码:
x = [] # an empty list
if not x: print("Here!")
# x passes this test
if x == False: print("There!")
# x doesn't pass this test
x = None
:此时not x
为True,而x == False
为False。与x = False
不同,此时两者都为True。not
语句还可以处理空值。
bool(x)
和__bool__
。 - Mad Physicist