我偶然发现了伤害我大脑的事情。请考虑以下
fs = []
for i in range(3):
fs.append(lambda : normal(i, .001))
print mean([fs[-1]() for j in range(1000)])
print [mean([fs[i]() for j in range(1000)]) for i in range(3)]
返回,例如
-1.38651717873e-05 |
1.00003545604 |
1.99999343229 |
[2.0530899455777235e-05, 0.99995283932453838, 2.0000045292311737]
正如所料。现在稍微修改一下
fs = []
for i in range(3):
mu = i
fs.append(lambda : normal(mu, .001))
print mean([fs[-1]() for j in range(1000)])
print [mean([fs[i]() for j in range(1000)]) for i in range(3)]
我们得到了
5.56620751611e-06 |
0.999999076252 |
1.99995161119 |
[2.0000016397219098, 1.9999853403014964, 2.0000209870831158]
即。 2对于循环外的每个。在我的大脑开始,我记得python中的引用/范围是邪恶的,似乎答案是通过引用而不是通过值存储mu传递到正常的mu(即使mu应该用普通语言进行查找) 。那是怎么回事?如何在未来的编码中避免类似的疯狂?
答案 0 :(得分:1)
Python中的闭包名称(好吧,不是技术上的,但你可以这样想)。因此,每个lambda的2
值都为mu
,因为这是循环中mu
的最后一个值。要在函数定义时修复mu
的值,只需使用默认参数值,如下所示:
lambda mu=mu: normal(mu, .001)
(范围规则与此无关。)