0 是 False 而所有其他整数值是 True 吗?

Is 0 False and all other integer values True?

我一直在研究一段非常棘手的 python 代码。我知道答案,但我不明白为什么答案是这样。

def f(x): 
    return x

def g(x, y):
    if x(y):         # does x(3) == True?
        return not y # is != 3 == False?
    return y

x = 3
x = g(f, x)
f = g(f, 0)

所以据我所知,首次调用 g(x,y) 时变量 x 的值解析为 False。我很困惑为什么这是因为下面一行:

if x(y)

这从 g(x,y) 内部调用 f(x) 并将 3 传递给它。然后 f(x) returns 3 再次触发 return not y。在这种情况下 x(3) 是否等同于 True?这是为什么?然后,下次调用 f(x) 并传递 0 时,会触发 return y。这是否意味着 x(0)False?另外,not y 的值是多少,因为有人告诉我它是 False,我不明白 not 3 的值是 False。如果我问这个问题的方式令人困惑,我真的很抱歉,但我不确定还有什么办法可以解决。非常感谢任何帮助!!

0 和 1 分别类似于布尔值 FalseTrue

你可以这样测试:

>>> bool(0)
False
>>> bool(1)
True

事实上,每个不为零的数字都是真实的:

>>> bool(3)
True

这再次证实 not 数字(非零)产生 False(不是 True = False):

>>> not True
False
>>> not 3
False

当你使用像 if x 这样的 if 语句时,Python 实际上会检查 bool(x) 的值。 bool 由 "dunder method" __bool__ 实现,它是在整数上实现的,与您观察到的行为完全相同:

In [1]: bool(1)    
Out[1]: True       

In [2]: bool(2)    
Out[2]: True       

In [3]: bool(0)    
Out[3]: False      

当然,如您所料:

In [4]: bool(True)
Out[4]: True

In [5]: bool(False)
Out[5]: False

这条规则相当笼统。 None0[]{}、一般的空容器等都是"falsey",其他都是"truthy"。

In [6]: bool(None)
Out[6]: False

In [7]: bool([])
Out[7]: False

但是

In [9]: bool([0])
Out[9]: True

这些示例可能会有所帮助。基本上当你传递 g(f, 0) 时,它 returns false,所以它 returns y,not (not y)。任何其他数字都是真实的,所以它不通过 y,这对任何数字都是错误的。希望对您有所帮助。


In [7658]: not True                                                                                                                                                               
Out[7658]: False

In [7659]: not False                                                                                                                                                              
Out[7659]: True

In [7660]: not 0                                                                                                                                                                  
Out[7660]: True

In [7661]: not 1                                                                                                                                                                  
Out[7661]: False

In [7662]: not 3                                                                                                                                                                  
Out[7662]: False

In [7673]: g(f, 0)                                                                                                                                                                
Out[7673]: 0

一个 0 的整数,一个 0.0 的浮点数,一个空的 list/tuple/dict/set,一个空的字符串或字节,一个 None 在 Python 中都是 Falsy,这意味着它们被评估为错误的。其他任何东西都是真实的。在整数的情况下,任何非零整数都是真实的。

所以在下面的代码中:

if x:
    print('yay')
else:
    print('nay')

如果 x 是上面总结的 Falsy 值之一,将始终打印 'nay'。对于任何非 Falsy x,总是会打印 'yay'。