当前位置: 首页 > 知识库问答 >
问题:

为什么当“如果不[]”成功时“[]==False”计算为False?

柴浩大
2023-03-14

我这样问是因为我知道检查列表是否为空的python方法如下:

my_list = []
if not my_list:
    print "computer says no"
else:
    # my_list isn't empty
    print "computer says yes"

将打印计算机说不,等等。因此,这导致我用真值识别[];但是,如果我试图“直接”比较[]和False,我会得到以下结果:

>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False

这到底是怎么回事?我觉得我错过了一些非常明显的东西。

共有3个答案

柯曜文
2023-03-14

Python中的内置类型有一个真值,允许您测试它们的真实性。见真值测试。

这不同于说object==False,后者正在进行实际值测试(相等性测试)。它使用对象\uuuu eq\uuuu()方法来确定它们的值是否相等。

金高飞
2023-03-14

空容器是“falsy”,也就是说,它们在布尔上下文中计算为False。这并不意味着它们实际上等于常量False

换句话说,以下是正确的:

bool([]) == False

对象的真值由其\uuuu非零 或其 \uuu len\uuuu()方法确定。(在Python3中, \uuu nonzero\uuu()已重命名为 \uuu bool\uuu())容器有一个 \uu len\uuu()方法,因此当容器中有任何内容时它们是真实的,当它们为空时它们是虚假的。

顺便说一句,如果空容器实际上等于False,那么任何空容器都将等于任何其他空容器:例如,{}=''将是True。那根本没有任何意义!

然而,让你大吃一惊的是,以下是真实的

False == 0

这是因为Boolean在Python中是整数的一个子类,False基本上只是一个零,其打印方式略有不同。

卞轶
2023-03-14

如果语句在布尔上下文中计算所有内容,就好像有一个对bool()内置函数的隐式调用。

下面是如何实际检查if语句将如何评估事物:

>>> bool([])
False
>>> bool([]) == False
True

请参阅关于真值测试的文档,空列表被认为是错误的,但这并不意味着它们等同于false

PEP 285也有一些关于为什么以这种方式实现的优秀信息,请参阅解决问题部分的最后一个项目符号,了解具体涉及x==Truex==False的部分。

对我来说,最有说服力的方面是==通常是可传递的,所以a==bb==c意味着a==c。因此,如果它是您期望的方式,并且[] == False是true,并且'' == False是true,人们可能会认为[] == ''应该是true(尽管它显然应该是true)不在没有隐式类型转换的语言中)。

 类似资料:
  • 问题内容: 我问这个问题是因为我知道以下检查列表是否为空的pythonic方法: 将打印等,所以这让我找出与真值; 但是,如果我尝试将[]和False直接“比较”,则会获得以下信息: 等等… 这里发生了什么?我觉得我确实缺少一些明显的东西。 问题答案: 该语句在布尔上下文中评估所有内容,就像对内置函数的隐式调用一样。 这是您实际检查语句如何评估事物的方式: 参见真值测试文档,空列表被 认为是错误的

  • 罗马数字颠倒一百 拉丁文小写字母反转C 变成数字二 变成数字三 为什么Python认为这些不是数字?

  • 可能重复: 如何比较Java中的字符串? 我不明白为什么声明的变量是不一样的。 ex代码: 现在这产生了一个布尔值,我以为它是真的,但它不是,它是假的,我不明白为什么。 有人能解释一下吗?

  • 问题内容: 我正在阅读本文: 在SQL中获取null == null 共识是,当尝试测试两个(可空)sql列之间的相等性时,正确的方法是: 当A和B为时,(A = B)仍返回FALSE,因为NULL不等于NULL。这就是为什么需要额外检查的原因。 检验不平等情况如何?经过以上讨论,我认为要测试不平等,我需要做一些类似的事情: 但是,我注意到这不是必需的(至少在informix 11.5上没有),我

  • 以下代码不打印任何内容: 但以下代码打印: 当为时,是否有比添加语句更好的方法打印或?