我对Python很陌生......喜欢它,但有一个奇怪的问题。这是一些代码:
def run(self):
print("receiver starting")
while self.receiving:
print("RX loop")
try:
print("RX: waiting for PDU from peer")
data, addr = self.rx_socket.recvfrom(32)
print("RX: received %d bytes"%(len(data)))
print("RX: self.receiving=%d"%(self.receiving))
print("XXXX RX: 0x%s"%(data.hex()))
# condition seems to be true but block not entered
if self.receiving == 1 & len(data) > 0:
my_pdu = 0
print("ZZZZ RX: 0x%s"%(data.hex()))
正如您所看到的,我在一个从套接字读取的线程中运行了一个循环。现在看看这个测试输出:
RX loop
RX: waiting for PDU from peer
RX: received 3 bytes
RX: self.receiving=1
XXXX RX: 0x022000
ZZZZ RX: 0x022000
RX loop
RX: waiting for PDU from peer
RX: received 8 bytes
RX: self.receiving=1
XXXX RX: 0x100100ffff020028
RX loop
RX: waiting for PDU from peer
我的第一次读取返回3个字节,我们在if块之外看到XXXX前缀打印语句,然后在if块中看到ZZZZ前缀语句,如预期的那样。
第二次读取返回8个字节,打印XXXX前缀行,但不输入if块,尽管条件(self.receiving == 1& len(data)> 0)都是真的根据打印XXXX行之前的值。
我的线程没有退出,否则我再也看不到“RX loop”行了。
你们中有没有经验丰富的Python人能告诉我这里我做错了什么?
谢谢
答案 0 :(得分:3)
问题是&
是按位和,你想要逻辑和,这是and
:
if self.receiving == 1 and len(data) > 0:
答案 1 :(得分:1)
既然你可以写while self.receiving:
,我认为它是一个布尔值;这意味着你可以写if self.receiving
。
&
是binary/bitwise and
运算符,它可能不是您想要的。我想你是在and
之后。
尝试更改
if self.receiving == 1 & len(data) > 0:
到
if self.receiving and len(data) > 0:
答案 2 :(得分:1)
在Python中,布尔AND只是and
而不是&&
或&
。