为什么这两个看似相同的表达式会有不同的评价? 这有效:
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
这里怎么了?我认为这两个应该是等价的。
答案 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