我这样问是因为我知道检查列表是否为空的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
等
这到底是怎么回事?我觉得我错过了一些非常明显的东西。
Python中的内置类型有一个真值,允许您测试它们的真实性。见真值测试。
这不同于说object==False
,后者正在进行实际值测试(相等性测试)。它使用对象\uuuu eq\uuuu()
方法来确定它们的值是否相等。
空容器是“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
基本上只是一个零,其打印方式略有不同。
如果
语句在布尔上下文中计算所有内容,就好像有一个对bool()
内置函数的隐式调用。
下面是如何实际检查if
语句将如何评估事物:
>>> bool([])
False
>>> bool([]) == False
True
请参阅关于真值测试的文档,空列表被认为是错误的,但这并不意味着它们等同于false
。
PEP 285也有一些关于为什么以这种方式实现的优秀信息,请参阅解决问题部分的最后一个项目符号,了解具体涉及x==True
和x==False
的部分。
对我来说,最有说服力的方面是==
通常是可传递的,所以a==b
和b==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上没有),我