为什么这两个看似相同的表达式的评价方式不同?

时间:2015-02-27 06:47:19

标签: python

为什么这两个看似相同的表达式会有不同的评价? 这有效:

from random import uniform

def binominal_rv(n,p):
    z=[]
    counter=0
    for i in range(n):
        U=uniform(0,1)
        if  U < p :                #true with probability p
            counter= counter + 1
    return counter

但这不是:

from random import uniform

def binominal_rv(n,p):
    z=[]
    counter=0
    for i in range(n):
        U=uniform(0,1)
        if  U < p== True :                #true with probability p
            counter= counter + 1
    return counter

这里怎么了?我认为这两个应该是等价的。

2 个答案:

答案 0 :(得分:3)

这是由于Python如何读取表达式。

U < p == True读为U < p and p == True。这显然不是我们想要的。

正如namit所说,我们可以使用括号(U < p) == True来解决这个问题。或者只使用U < p,与原始代码一样。


如果您想了解更多信息,Python language reference会详细解释此功能:

  

比较可以任意链接,例如,x < y <= z等同于x < y and y <= z,但y只评估一次(但在两种情况下z x < y当{{1}}被发现为假时,根本不评估1}}。

答案 1 :(得分:2)

更改if U < p== True :if (U < p)== True :

让我们举个例子:

In [38]: 2 < 4
Out[38]: True

In [39]: 2 < 4 == True
Out[39]: False

In [40]: (2 < 4) == True
Out[40]: True

In [41]: 4 == True
Out[41]: False

In [42]: 2 < False
Out[42]: False

In [43]: 4 == True
Out[43]: False

In [44]: (4 == True) == 0
Out[44]: True