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

Why is and operator on two values gives the last value?

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

如果我对 2 个整数执行按位运算(&、|),我将不出所料地得到它们的按位值
。 含义:

>>> a = 11
>>> b = 3
>>> a & b
3

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

>>> b and a
11

>>> 'b' and 'a'
'a'

为什么会这样?

第一个案例and

>>> b and a #(11 and 3, both the values evaluates to be true because non-zero)
11
>>> 'b' and  'a' #(again both are evaluated to be true because non-empty)

对于and,所有条件都需要是True,所以如果前面的计算结果是True,则检查到最后一项,因此你得到最后一项。

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

Python 的逻辑运算符专门设计用于 return 最后计算的对象的结果:

  • a and b:Returns 一个错误的 a,或 b(如果 a 是真实的)
  • a or b: Returns 一个 Truthy a, 或 b (if a if falsy)

来自tutorial

The Boolean operators and and or are so-called short-circuit operators: their arguments are evaluated from left to right, and evaluation stops as soon as the outcome is determined. For example, if A and C are true but B is false, A and B and C does not evaluate the expression C. When used as a general value and not as a Boolean, the return value of a short-circuit operator is the last evaluated argument.

此 属性 半惯用地用于在访问值之前检查值。例如,如果一个列表必须包含一个元素,你可以这样做

if x and x[0] == value:
    # ...

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

documentation 说:

The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.

由于 Python 将字符串和非零整数的布尔值都视为 True,因此 x and y 将暗示 True and True,并且由于第一条语句不为 False,计算第二条语句并返回结果值(即第二项的值)。

案例 1:A B
这里考虑 A , B 都是非零的,并且它检查 A, B ,即它首先评估 A 如果在二进制转换后的 A 中(为了理解考虑正整数,A > 0 和 B > 0)是否存在 1 或not ,如果是,它将移动到 B 并且 returns B 作为输出。因为 and 检查 A 和 B.

A B

在这里它检查 A 与上面相同,如果它在转换为二进制后有 1, 如果 A 为 True 则 return A(显然 A > 0 所以它 return A only )。

情况 2:假设 A、B 中的任意 1 或 A、B 均为 ZEROES 我会尝试以更好的方式解释。我希望我们都知道 'AND''OR''XOR' 的真值表。 这里发生的同样的事情只是用任何数字替换 1's 和 0's,如果你想你使用 只有 1's 和 0's 以更好的方式理解 .