这里有两件事需要你理解。第一:x or y

如果x是真实的,它具有的价值x(甚至没有评估y,因此23 or launch_nukes()不会发射核武器)。

否则,它的值为y。

或者,正如文档所说:表达式x or y首先评估x ; 如果x为真,则返回其值; 否则,评估y并返回结果值。

请注意,它在此处使用单词“true”,而不是值True。这有点令人困惑(如果你大声说话,或者在没有格式化的情况下输入ASCII,就更是如此......),这就是每个人都说“真理”的原因。

那么,“truthy”和“falsey”是什么意思?1“x是truthy”不不意味着x == True,这意味着bool(x) == True。

“x是falsey”不不意味着x == False,这意味着bool(x) == False。

对于所有内置和stdlib类型:False 是假的。

None 是假的。

数字零值是假的。

空容器是假的。

其他一切都是真实的。

请注意,None空容器是假的,但它们不等于False。

按照惯例,第三方类型(包括您定义的类型2)应遵循相同的规则。但有时候有充分的理由不这样做。(例如,NumPy数组既不真实也不虚假.3)在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:所有类型的False,None,数字零,以及空字符串和容器(包括字符串,元组,列表,字典) ,集和frozensets)。所有其他值都被解释为true。用户定义的对象可以通过提供__bool__()方法来自定义其真值。

所有内置类型的确切细节都隐藏在标准类型层次结构中,在这里您可以学习诸如是否bytes被“字符串和容器”覆盖的内容(是)或者是否有任何特殊内容NotImplemented(不,它是真实的)。

那么,让我们来看看你的例子:[1, 2] or ["hello"]

既然[1, 2]是一个非空容器,它就是真的。所以这等于[1, 2]。[] or ["hello"]

既然[]是一个空容器,它就是假的。所以这等于["hello"]。[] == False

[]可能是假的,但它不是False,甚至不等于False。只有数字等于其他数字和False是在数字型数字0 bool,4但[]不是数字。所以这是False。

很高兴你没有问过is。:)

1.从技术上讲,这些术语没有定义,即使每个人,甚至是核心开发者,都会一直使用它们。官方参考通过评估为真或假的布尔值来定义事物,然后解释其他地方的含义。

2.您可以通过定义__bool__方法或通过定义来控制类型的值是否真实__len__。你被允许做的唯一事情是返回True,返回False或提出异常; 如果你试图返回任何不同的东西,它会引发一个TypeError。所以,一切都是真实的,或者是虚假的,或者是不可测试的。

如果你试图检查它的真实性,它会引发异常。那是因为NumPy广泛使用布尔数组 - 例如,array([1, 2]) < array([2, 1])是array([True, False]),并且你不希望人们写作if array([1, 2]) < array([2, 1]):,因为无论他们期望它做什么都可能没有意义。

是的,bool是一个数字类型 - 实际上是一个子类int。当你第一次学习时,这有点奇怪,但事实证明它更有用而不是危险,所以它不仅仅是出于历史原因而保留下来。