python中"and"运算符的问题



我正在做一个看起来很简单的练习,但是我遇到了一个"and"orperator。我想我很清楚它是如何工作的:

print("0 and 0 : ", (0 and 0))
print("0 and 1 : ", (0 and 1))
print("1 and 0 : ", (1 and 0))
print("1 and 1 : ", (1 and 1))
print((0 and 1) == (1 and 0))

这给了我预期的结果:

0 and 0 :  0
0 and 1 :  0
1 and 0 :  0
1 and 1 :  1
True

但是当我运行这段代码时:

A = '00111000111000111000111000'
B = '00001110001110001110001110'
for i in range(len(A)):
s1s2 = (A[i] and B[i])
s2s1 = (B[i] and A[i])
print(f"s1={A[i]}, s2={B[i]}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))

我最终在我的控制台使用Python3.9在VSCode上无意义的结果(我也试过在线):

s1=1, s2=0, s1 and s2 = 0 ; s2 and s1 = 1 : False
s1=0, s2=1, s1 and s2 = 1 ; s2 and s1 = 0 : False

同样的问题出现在"or"

A = '00111000111000111000111000'
B = '00001110001110001110001110'
for i in range(len(A)):
s1s2 = (A[i] or B[i])
s2s1 = (B[i] or A[i])
print(f"s1={A[i]}, s2={B[i]} || s1 or s2 = {s1s2} ; s2 or s1 = {s2s1}  || s1s2 == s2s1 : ", (s1s2) == (s2s1))

返回无意义的东西:

s1=1, s2=0 || s1 or s2 = 1 ; s2 or s1 = 0  || s1s2 == s2s1 :  False
s1=0, s2=1 || s1 or s2 = 0 ; s2 or s1 = 1  || s1s2 == s2s1 :  False

我试图在运行循环之前将字符串A和B转换为列表,但它给了我相同的结果。你知道这是怎么回事吗?我错过了什么或做错了什么?

and返回计算结果为False的第一个值,或者在它们都不为假的情况下返回最后一个值。对于每个非空("")字符串,Python中字符串的布尔值为True。这意味着即使'0'被认为是True,而0(整数)不是。

考虑到这两个因素,当您逐个char执行s1 and s2时,它的值将是s2,因为它是最后一个并且所有值都被计算为True。

让我们看一个稍微不同的例子:

0 and None -> 0
None and 0 -> None
'1' and '0' -> '0'
'0' and '1' -> '1'

为什么?在前两种情况下,0(一个整数)和None都是假的,所以返回第一个。在后两种情况下,您有非空字符串,它们都为真,因此返回第二个字符串。

有几种方法可以将第二个结果固定为与整数比较相同的结果。最简单的方法是根据需要将每个位转换为整数:

A = '00111000111000111000111000'
B = '00001110001110001110001110'
for a, b in zip(A, B):
a = int(a)
b = int(b)
s1s2 = (a and b)
s2s1 = (b and a)
print(f"s1={a}, s2={b}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))

另一种方法是直接处理整数并使用位篡改。这需要您显式地设置位数,因为像int(A).bit_length()这样的东西将丢弃任何前导零:

N = 26
A = 0b00111000111000111000111000
B = 0b00001110001110001110001110
for i in range(N - 1, -1, -1):
a = (A & (1 << i)) >> i
b = (B & (1 << i)) >> i
s1s2 = (a and b)
s2s1 = (b and a)
print(f"s1={a}, s2={b}, s1 and s2 = {s1s2} ; s2 and s1 = {s2s1} :", (s1s2) == (s2s1))

在这两种情况下都可以省略>> i,因为它不影响(X & (1 << i))选择的位的真值。还有,1 << i == 2**i.

您正在对非空字符串进行AND或or操作。这些总是计算为True

最新更新