Python “为什么?”;[]==假;“当”时评估为假;如果不是【】”的话;成功?
我这样问是因为我知道检查列表是否为空的python方法如下:Python “为什么?”;[]==假;“当”时评估为假;如果不是【】”的话;成功?,python,Python,我这样问是因为我知道检查列表是否为空的python方法如下: my_list = [] if not my_list: print "computer says no" else: # my_list isn't empty print "computer says yes" >>> my_list == False False >>> my_list is False False >>> [] == False F
my_list = []
if not my_list:
print "computer says no"
else:
# my_list isn't empty
print "computer says yes"
>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False
将打印计算机说不
,等等。因此,这导致我用假
真值识别[]
;但是,如果我试图“直接”比较[]和False,我会得到以下结果:
my_list = []
if not my_list:
print "computer says no"
else:
# my_list isn't empty
print "computer says yes"
>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False
等等
这是怎么回事?我觉得我遗漏了一些非常明显的东西。如果语句在布尔上下文中计算所有内容,就好像有一个对内置函数的隐式调用 下面是您如何实际检查
if
语句将如何评估事物:
>>> bool([])
False
>>> bool([]) == False
True
请参阅上的文档,空列表被视为false,但这并不意味着它们等同于false
还有一些关于它为何以这种方式实现的优秀信息,请参见解决问题部分中的最后一个项目符号,具体涉及x==True
和x==False
对我来说,最令人信服的方面是=
通常是可传递的,因此a==b
和b==c
意味着a==c
。因此,如果它是您期望的方式,并且[]==False
是真的,'==False
是真的,那么您可能会认为[]='
应该是真的(即使它显然不应该在没有隐式类型转换的语言中)。空容器是“falsy”,即,在布尔上下文中,它们的计算结果为False
。这并不意味着它们实际上等于常量False
换句话说,以下是正确的:
bool([]) == False
False == 0
对象的真值由其\uuuu非零
或其\uuu len\uuuu()
方法确定。(在Python3中,\uuu nonzero\uuu()
已重命名为\uuu bool\uuu()
)容器有一个\uu len\uuu()
方法,因此当容器中有任何内容时它们是真实的,当它们为空时它们是虚假的
顺便说一句,如果空容器实际上等于False
,那么任何空容器都将等于任何其他空容器:例如,{}=''
将是True
。那根本没有任何意义
然而,让你大吃一惊的是,以下是真实的:
bool([]) == False
False == 0
这是因为Boolean在Python中是整数的一个子类,
False
基本上只是一个零,其打印方式略有不同。Python中的内置类型有一个真值,允许您测试它们的真实性。看
这不同于说
object==False
,后者正在进行实际值测试(相等性测试)。它使用对象\uuu eq\uuu()
方法来确定它们的值是否相等。在您的示例中,not运算符使列表转换为布尔值。试试这个:
>>> not []
True
>>> not [1]
False
“是”和“==”不要进行转换。我个人认为这是最有用的答案。真实是一个有趣的概念,可能会导致一些不直观的后果。以JavaScript及其底层值为例。@dwerner:是的,我同意。当我说
if-object:
时,我试着把它想象成“if-this-object has content:这是一个非常好的观点,not
操作符正在转换为布尔值,但它是反向的(非[])==True
和(非[1])==False
。这是一个很好的设计,因为它还让程序员不用if variable==True:
子句。如果变量为真,则它应该是:
(这完全是真的,而不是其他任何东西——在大多数情况下,这不是做事情的最佳方式),或者如果变量为真(它是truth-y)。“尽管它显然不应该是,”Javascript说。