21

在 Python 控制台中:

>>> a = 0
>>> if a:
...   print "L"
... 
>>> a = 1
>>> if a:
...   print "L"
... 
L
>>> a = 2
>>> if a:
...   print "L"
... 
L

为什么会这样?

4

5 回答 5

29

在 Python 中,bool是 的子类int,并且False具有值0; 即使值没有boolif语句中隐式转换(它们是),False == 0也是如此。

于 2012-09-19T15:04:52.943 回答
14

0 是 python 中的假值

虚假值:来自(2.7)文档:

任何数字类型的零,例如 0、0L、0.0、0j。

于 2012-09-19T14:49:49.007 回答
7

if子句中的任何内容都隐含地bool调用了它。所以,

if 1:
   ...

是真的:

if bool(1):
   ...

bool调用__nonzero__1表示对象是TrueFalse

演示:

class foo(object):
    def __init__(self,val):
        self.val = val
    def __nonzero__(self):
        print "here"
        return bool(self.val)

a = foo(1)
bool(a)  #prints "here"
if a:    #prints "here"
    print "L"  #prints "L" since bool(1) is True.

1__bool__在 python3.x 上

于 2012-09-19T14:51:32.957 回答
0

我认为它只是以 0 或非 0 来判断:

>>> if 0:
    print 'aa'

>>> if not 0:
    print 'aa'


aa
>>> 
于 2012-09-19T17:00:21.543 回答
0

首先,python 中的一切都是对象。因此,您的 0 也是一个对象,具体来说,是一个内置对象。

以下是被认为是错误的内置对象:

  1. 定义为假的常量:无和假。
  2. 任何数字类型的零:0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  3. 空序列和集合:'', (), [], {}, set(), range(0)

因此,当您将 0 置于 if 或 while 条件或布尔运算中时,将对其进行真值测试。

# call the __bool__ method of 0
>>> print((0).__bool__())
False

# 
>>> if not 0:
...     print('if not 0 is evaluated as True')
'if not 0 is evaluated as True'
于 2019-11-24T17:49:50.693 回答