2016-04-06 47 views
5

我有一个C++的背景,并试图学习一些python。后期绑定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])) 
) 

究竟发生在这里?当函数被附加到列表中时,它具有什么值?有人可以简化这段代码让我明白。

回答

1

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

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

因此,由你正在建设一个功能叫FUNC每次迭代,取一个值,它乘以n个。通过将它附加到函数列表中,您将可以存储这些函数,因此您可以迭代列表来调用函数。

[function(2) for function in functions] 

通过这样做你调用每个存储在与值2的功能,则希望它可以输出[2, 4, 6]([1 * 2,2 * 2,3 * 2]),而是它返回[6, 6, 6] ,为什么?,这是因为它的计算每个功能使用n,所以他们并没有真的做1*x, 2*x and 3*x,但实际上n*x,并且因为x被绑定在上次到3所有功能都在做3*2这将成为6

玩弄python控制台来检查它是否正确。

0

在C++语言中,指向该函数的指针是正在追加到列表中的内容。在for循环之后,functions包含指向三种不同功能的指针(func(x) = n * x,func(x) = n * xfunc(x) = n * x)。注意对n的依赖。随着n的变化,这些函数的行为也会发生变化,并且它们都是等价的。

在代码的第二部分,从列表中提取指针,并使用参数2评估三个函数中的每一个函数。

这是一个进一步阐明的例子。想象一下,我们这样做:

>>> functions 
[<function func at 0x0239AA70>, <function func at 0x0239AAB0>, <function func at 0x0239AB30>] 
>>> g = functions[2] 
>>> g 
<function func at 0x0239AB30> 
>>> g(10) 
20 
>>> g(100) 
200 

我们在第一行看到的是函数包含指向三个不同函数的指针。下一行从列表中提取第三个指针(指func(x) = n * x)并将其分配给g。实际上,我们已通过此调用定义了一个功能g(x) = n * x。我们现在可以用参数评估g

请注意,由于所有功能取决于n,因此您可以更改n,并且行为会发生变化。

>>> n = 100 
>>> g(10) 
1000 
+0

但这样岂不一代产量[2 4 6]而不是[6 6 6] – RickMota

+0

丹尼尔的答案是正确的 - 他抓住的东西,我没有。它们都指n,并且由于n在最后定值为2,所有函数的行为将完全相同。 – Christian

+0

我已经修改过提到n的依赖关系,并且正在发布解决方案以澄清与C++中指针的连接。 – Christian