后期绑定python闭包

Bob*_*obo 6 python

我有一个C++的背景,并试图学习一些python.

我理解C++的虚函数,遗憾的是我不明白python中后期绑定的含义是什么意思.

链接:https://gist.github.com/deemson/8efabf56d67623ead804

从教程复制面食:

functions = []
for n in [1, 2, 3]:
    def func(x):
        return n*x
    functions.append(func)

# You would expect this to print [2, 4, 6]
print(
    'calling a list of bad closures and output is: {}'
    .format(str([function(2) for function in functions]))
)
Run Code Online (Sandbox Code Playgroud)

到底发生了什么?当函数附加到列表中时,它具有什么值?有人可以简化这段代码让我理解.

Net*_*ave 9

请注意这一点,您可以在运行时创建函数,或多或少像lambdas在 C++ 中一样。所以基本上你正在迭代一个列表,使n取值1,2 and 3

for n in [1, 2, 3]:
    def func(x):
        return n*x
Run Code Online (Sandbox Code Playgroud)

因此,通过每次迭代,您都在构建一个名为 func 的函数,它接受一个值并将其乘以 n。通过将它附加到函数列表,您将存储这些函数,因此您可以遍历列表以调用函数。

[function(2) for function in functions]
Run Code Online (Sandbox Code Playgroud)

通过这样做,您调用存储有 value 的每个函数2,您会期望它输出[2, 4, 6]([1*2, 2*2, 3*2]),但它返回[6, 6, 6],为什么?,那是因为每个函数都n用于它的计算,所以他们不是真的在做,1*x, 2*x and 3*x而是实际上n*x,因为n上次绑定到3所有正在做的功能,3*2变成6.

使用 python 控制台来正确检查它。