为什么下面代码的输出是这样的

Why the output of below code is like this

根据我对按位运算符的理解,下面的代码应该只在 i 和 j 都等于 5 时执行,对于 i 和 j 的所有其他值,如果条件应评估为 False。但我得到以下输出:

for i in range(30):
    for j in range(30):
        if i == 5 & j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

输出:

# i, j, i & j, binary value of i, binary value of j, bitwise and of i == 5 and j == 5
5 5 5 0b1 0b1 True
5 7 5 0b1 0b0 False
5 13 5 0b1 0b0 False
5 15 5 0b1 0b0 False
5 21 5 0b1 0b0 False
5 23 5 0b1 0b0 False
5 29 5 0b1 0b0 False

问题:

  1. i 和 j 的二进制值只有第一种情况是 1,那为什么打印其他情况?

  2. 为什么在 i 和 j 评估为 5 的地方打印结果

  3. 如果我改变上面 if 语句中的条件顺序,i 获取值 5, 7, 13, 15, 21, 23, 29 而 j 仍然是 5,其他输出也相同.为什么?

  4. 对于上面的代码,i = 7 和 j = 5,i & j 的计算结果也为 5。那为什么不打印呢?

您漏掉了括号的简短回答:

for i in range(30):
    for j in range(30):
        if (i == 5) &  (j == 5):
            print(i, j, i & j, bin(i==5), bin(j == 5), i == 5 & j == 5)

首先计算 (i==5) 和 (j==5),然后将结果布尔值与另一个结果布尔值进行比较。

或者如下所述,只使用 and。如果您想对此进行更多探索,请查看以下结果:

for x in range(0, 32):
    print(x & 2, bin(x), bin(2), bin(x & 2))

您可以在这里找到详细的工作原理:

https://wiki.python.org/moin/BitwiseOperators

使用运算符 "and" 代替“&”。它会解决你的问题。

and : 逻辑运算符
& : 按位运算符

for i in range(30):
    for j in range(30):
        if i == 5 and j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

结果:

5 5 5 0b1 0b1 True

参考文献 1:

Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?

参考文献 2:

来自documentation

Unlike C, all comparison operations in Python have the same priority, which is lower than that of any arithmetic, shifting or bitwise operation. Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics:

所以在这里:

i == 5 & j == 5

发生的事情是 5 & j 针对 i5 进行相等性测试。所以括号会起作用,但正确的方法是使用 logical and 运算符,它具有更高的优先级:

i == 5 and j == 5

它也短路,这意味着如果i != 5j甚至没有被测试(更快的执行)。完美适用于此示例。