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

我这样问是因为我知道检查列表是否为空的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
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说。