python值与参考

时间:2013-06-26 19:46:51

标签: python reference scope

我偶然发现了伤害我大脑的事情。请考虑以下

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应该用普通语言进行查找) 。那是怎么回事?如何在未来的编码中避免类似的疯狂?

1 个答案:

答案 0 :(得分:1)

Python中的闭包名称(好吧,不是技术上的,但你可以这样想)。因此,每个lambda的2值都为mu,因为这是循环中mu的最后一个值。要在函数定义时修复mu的值,只需使用默认参数值,如下所示:

lambda mu=mu: normal(mu, .001)

(范围规则与此无关。)