python - "late binding closures"是什么意思?

标签 python python-closures

<分区>

我有 C++ 背景,正在尝试学习一些 python。

虽然我了解 C++ 的虚函数,但不幸的是我不明白 python 中闭包的后期绑定(bind)是什么意思。

链接: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]))
)

这里究竟发生了什么?当函数附加到列表中时,它有什么值?有人可以简化这段代码以便我理解吗?

最佳答案

请注意,您可以在运行时创建函数,或多或少类似于 c++ 中的 lambdas。所以基本上你是在遍历一个列表,使 n 取值 1,2 和 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 和 3*x,而是在执行 n*x 并且因为 n 上次绑定(bind)到 3 所有函数都在执行 3*2 变成 6

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

关于python - "late binding closures"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463498/

相关文章:

python - PLY 中的 IF 语句

python - 词法闭包是如何工作的?

python - 使用 python-daemon 守护 python 脚本-套接字问题

Python - 在字符串中查找数字

python - 正则表达式匹配字符串 'xxx(yyy) (zzz(qqq))' 或 'xxx(yyy)'

python - 表格格式化,打印出行名