后期绑定python闭包

时间:2016-04-06 22:33:05

标签: python

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

惠斯特我理解C ++的虚函数,遗憾的是我不明白python中后期绑定绑定意味着什么。

链接:Xamarin.UITest 1.3.6.1476-dev

教程中的复制意大利面:

/some/real/location

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

2 个答案:

答案 0 :(得分:3)

请注意,您可以在运行时创建函数,或多或少像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以及n } {} {}} {}} {}}

使用python控制台进行正确检查。

答案 1 :(得分:0)

在C ++语言中,指向该函数的指针是附加到列表中的内容。在for循环后,functions包含指向三个不同函数(func(x) = n * xfunc(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