2016-11-10 41 views
-1

任何人都可以解释为什么if条件正在工作。Tricky Simple Python

x = 0xA5 

if x == 0xAA or 0x5A or 0xA0 or 0xAB: 
    print "Host Address is Correct" 



0xAA or 0x5A or 0xA0 or 0xAB binary operation is not equal to 0xA5 either 
+6

'0x5A'为真,所以条件成立。也许你的意思是'(0xAA,0x5A,0xA0,0xAB)'? – spectras

+0

也许你想检查x是否等于任何这些值? – Peaceful

+1

'如果x在[0xAA,0x5A,0xA0,0xAB]' –

回答

2

Python是不是做了什么你认为它是 - 当你说

if x == 0xAA or 0x5A or 0xA0 or 0xAB: 

它检查是否x==0xAA0x5a是“truthy” - 其中一个非空字符串,例如,被认为是True - 依此类推。你得到的错误表明0x5A, 0xA0, 0xAB之一是“truthy”。什么,你需要做的是

if x == 0xAA or x == 0x5A or x == 0xA0 or x == 0xAB: 

从而可以更加方便地为

if x in [0xAA, 0x5A, 0xA0, 0xAB]: 

表示虽然它应该指出的是,如果0xAA等都是字符串,它们需要被写为'0xAA'

+0

它不检查'0x5a == True',这显然是错误的,它检查它是否真实。 –

+0

你是对的,@FranciscoCouzo,形式不好的措辞形式。我将编辑为 – asongtoruin

2

由于运营商优先级,==拥有较高的优先级,因此or所以 x==0xAA首先评估并返回False但其他每个十六进制字符都返回True,所以基本上你的表达式变成 x = False or True or True or True这将导致True。

你应该修改你的代码来获得你想要的操作。

x = 0xA5 

if x == (0xAA or 0x5A or 0xA0 or 0xAB): 
    print("Host Address is Correct") 

这里检查运算符优先级 https://www.tutorialspoint.com/python/operators_precedence_example.htm

+0

我不认为这是OP想要的(计算0xAA或0xA0是没有意义的)。我想他实际上是想比较每个价值。 – spectras

+0

@Spectras他的问题是为什么它不工作,他不清楚他想要什么 –

0

SAURABH是正确的它是一个优先的问题,你的表达正在评估这样的:

x == (0xAA or 0x5A or 0xA0 or 0xAB) 

当你最有可能要使用:

x in (0xAA, 0x5A, 0xA0, 0xAB)