为什么两个值上的 and 运算符给出最后一个值?

tHe*_*ver 1 python logical-operators python-3.x

我一直在对 Python 运算符进行一些修改,但遇到了一些我不确定的事情。

如果我对 2 个整数执行按位运算 (&, |) ,我将毫不奇怪地得到它们的按位值
。意义:

>>> a = 11
>>> b = 3
>>> a & b
3
Run Code Online (Sandbox Code Playgroud)

这是因为按位和执行和对这些数字的二进制表示。但是,如果我使用内置的 and 运算符,我将获得第二个变量,而不管它是什么类型:

>>> b and a
11

>>> 'b' and 'a'
'a'
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Mad*_*ist 8

逻辑运算符对对象的真实性进行操作。每个对象都有真值,除非它有一个__bool__被显式覆盖以引发错误的方法。a and b(logical) 和a & b(bitwise)之间的主要区别在于,前者适用于任何对象,而后者仅适用于支持按位运算的数字类型。

Python 的逻辑运算符专门用于返回最后一个评估对象的结果:

  • a and b: 返回一个 Falsy a,或者b(如果a是真的)
  • a or b: 返回一个 Truthy a,或ba如果为假)

教程

布尔运算符andor所谓的短路运算符:它们的参数从左到右求值,一旦确定结果就停止求值。例如,如果AC为真但B为假,A and B and C则不计算表达式C。当用作一般值而不是布尔值时,短路运算符的返回值是最后一个求值的参数。

此属性半惯用地用于在访问值之前检查值。例如,如果列表必须包含一个元素,您可以执行以下操作

if x and x[0] == value:
    # ...
Run Code Online (Sandbox Code Playgroud)

这不会引发错误,因为如果x是 Falsy(空),则and表达式将返回x而不是x[0] == value

  • 许多类型缺少“__bool__”方法。如果缺少“__bool__”,则“__len__”的非零返回值表示真实性。如果`__len__`也缺失,则该对象被认为是真实的。(例如,“list”定义了“__len__”,但没有定义“__bool__”,而“object”两者都没有定义。) (2认同)