我试图了解__and__
抽象基 int 类的方法。在这里,我以两种不同的方式调用了该方法。在几乎所有情况下,这两种方式的行为都符合我的预期,它们输出第二个值,因为这两个值都是“真实的”。但是在两个数字之和 = -1 的特殊情况下,第一种方式打印 0。谁能说出为什么?
value = -4
print(value.__and__(3)) # prints 0
print(value and 3) # prints 3
我试图了解__and__
抽象基 int 类的方法。在这里,我以两种不同的方式调用了该方法。在几乎所有情况下,这两种方式的行为都符合我的预期,它们输出第二个值,因为这两个值都是“真实的”。但是在两个数字之和 = -1 的特殊情况下,第一种方式打印 0。谁能说出为什么?
value = -4
print(value.__and__(3)) # prints 0
print(value and 3) # prints 3
“问题”不在于__and__
运营商。python中的按位运算符and
不是&
:
>>> (7).__and__(5) == (7 & 5)
True
至于如何and
与非布尔值交互,您可以阅读此答案。对于您的特定情况:
and
如果有,则返回第一个 Falsy 值,否则返回表达式中的最后一个值。
在您的情况下,两者-4
和3
都是非 Falsy 值,因此3
返回最后一个值 ( )。考虑到什么被认为是 Falsy,我们也可以理解为什么-4 and 0 and 3 == 0
,即,因为0
是 Falsy。
请注意,and
操作员的这种行为是有意义的。它只是以最自然的方式(或至少一种最自然的方式)扩展了自然布尔值和运算符的逻辑。例如,True and False and False and x
, 将在遇到False
第一个时立即返回False
,而True and True and x
将简单地返回x
,因为所有先前的布尔值都验证了全局语句。
最后,按位运算符在处理负数时明显奇怪的行为来自负数的编码方式。基本上,要将正数(例如,4 = 000100)变为负数,您只需将其所有位(111011)取反,然后加 1(111100 = -4)。在评估3 & -4
中相当于解决以下问题:
000011
& 111100
--------
= 000000
出于同样的原因x & -4
,将评估4
任何x
in 4, 5, 6, 7
(两个低位总是被 -4 的二进制表示(111100)中的终止零取消。
有同学指出and ()方法使用的是“按位与”。不是正常的AND。此外,我在计算中使用有符号整数而不是二进制补码。