为什么我的python if条件似乎是真的时没有输入?

时间:2016-04-21 14:26:03

标签: python python-3.x

我对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人能告诉我这里我做错了什么?

谢谢

3 个答案:

答案 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而不是&&&