Python 什么';If not(变量)和If(变量)==false之间的差异是多少?

Python 什么';If not(变量)和If(变量)==false之间的差异是多少?,python,if-statement,conditional-statements,Python,If Statement,Conditional Statements,我正在学习Python,我刚刚开始学习布尔条件 不过,对于“如果不是”这一特定主题,我感到非常困惑。有人能给我解释一下以下两者的区别吗 x=False 如果不是x: 打印(“你好”) 如果x==False: 打印(“你好”) 在Python编译器上测试此代码时,我收到两次“hello”。我可以假设这意味着它们对计算机的意义是相同的 有人能给我解释一下为什么使用一种方法而不是另一种方法吗?在一种情况下,您正在检查值“False”是否相等,而在另一种情况下,您正在对变量执行布尔测试。在Python

我正在学习Python,我刚刚开始学习布尔条件

不过,对于“如果不是”这一特定主题,我感到非常困惑。有人能给我解释一下以下两者的区别吗

x=False
如果不是x:
打印(“你好”)
如果x==False:
打印(“你好”)
在Python编译器上测试此代码时,我收到两次“hello”。我可以假设这意味着它们对计算机的意义是相同的


有人能给我解释一下为什么使用一种方法而不是另一种方法吗?

在一种情况下,您正在检查值“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
notx
将为True,而
x==False
将为False。与
x=False不同,当这两个都为True时<代码>非
语句也解释了空值。

这取决于™. 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
在第一种情况下,python通过调用
\uuuuu bool\uuu
进行布尔测试,在第二种情况下,python通过调用
\uuuuu eq\uu
进行相等性测试。这意味着什么取决于班级。这通常是显而易见的,但像熊猫这样的东西可能会变得棘手


通常,
not x
x==False
快,因为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
运算符通常会在确定之前进行第。在您的例子中,当
x=False
您处理的是一个用C编写的内置类,它的两个操作将类似。但是,
x==False
比较仍然需要对另一端进行类型检查,因此速度会慢一些。

这里已经有几个好的答案,但是没有一个讨论Python中“truthy”和“falsy”表达式的一般概念

在Python中,truthy表达式是转换为
bool
时返回
True
的表达式,而falsy表达式是转换为
bool
时返回
False
的表达式。(参考:我不是亨纳的下属,我只是喜欢他的教程。)

真实的东西: 这里重要的是
0
0.0
[]
None
False
都是错误的

当在
if
语句中使用时,它们将通过测试,并在
if not
语句中通过测试

虚假的东西: 非零数字、非空列表、许多对象(但请阅读@tdelaney的答案了解更多详细信息)和
True
都是真实的,因此它们通过
if
测试,而不通过
测试

平等测试 当你使用平等测试时,你不是在问一个表达式的真实性,你是在问它是否与你提供的其他东西相等,这比一般的真实性或错误性要严格得多

编辑:其他参考资料 下面是关于Python中“Truthy”和“Falsy”值的更多参考:


请从下一页重复和。你要求的是关于一个主题的个人教程,这个主题在其他地方已经被完全涵盖了。请参阅。另外,请阅读关于
bool(x)
\uuuubool\uuuuu
的内容,我认为这个问题与主题有关。这两种形式之间的区别并不明显。高度类型化语言中的优化编译器可能会将这两条语句转换为相同的代码位,但python不会。这是语言的基础,为什么呢?@Prune我从CodeAcademy那里学到了if not语句,但这个话题仍然让我困惑,我无法理解它。我环顾四周寻找答案,但没有人能回答我的具体想法。如果我问这类问题让你不高兴,我很抱歉,当我问另一个问题时,我会记住这些术语。不,这不是无关紧要的。再次,请参阅我链接的发布指南。当我输入此代码时,它会打印两次“Here!”。但这非常令人困惑,它如何将0识别为False?0是一个数字。这个错误是我的,这对于Python来说是非常特殊的(我完全忘记了lol),但是0和False对于编译器来说是一样的。现在试着运行它,我已经修复了它。一般来说,布尔测试(if/if-not)比比较True或False要远得多。还有一件事,O'Reilly的《学习Python》一书非常全面地讨论了这些概念性的东西。我真的很推荐它。在if语句之前,我不太确定您编写的代码必然意味着什么,但对于“速度”的解释,它确实帮助很大。非常感谢D不确定附加注释是否有用
Foo
是一个覆盖测试中使用的神奇方法的类。它变得更加复杂,因为python还为没有给定magic方法的类提供了回退规则。默认的
对象
对象实现了默认的魔法方法,而大多数派生对象实际上不会自己重新实现它们。哇,非常感谢你,伙计