gpt4 book ai didi

python - Python 与 ML 中的词法作用域

转载 作者:太空狗 更新时间:2023-10-29 21:26:46 27 4
gpt4 key购买 nike

我进退两难了,拿下面这段用ML写的代码:

val x = 1
fun f(y) = x + y
val x = 2
val y = 3
val z = f (x + y)

z 的值为 6。现在,如果我在 python 中编写相同的代码,z 的值将是 7。两种语言都声称(实际上教授这些语言的老师声称)具有词法/静态范围。但看起来只有 ML 通过使用在每次调用 f 时定义 f 函数时创建的环境来拥有它

如有任何指点,我们将不胜感激!

谢谢!

最佳答案

在 Python 中,闭包是按变量,而不是按值。因此,当您在函数中引用 x 时,它指的是分配给 x 的最新值,而不是 x 的值功能被定义。这会得到如下所示的非直观结果:

adders = []
for x in range(10):
adders.append(lambda y: x+y)

您打算制作一个将 x 添加到一个值的函数列表,其中 x 从 0...9 变化,但它们都加 9,因为那是循环结束时 x 的值。

您可以通过在函数定义时使用默认参数将名称绑定(bind)到它的值来覆盖它。

x = 1
f = lambda y, x=x: x + y # x inside f is now locked at 1
x = 2
y = 3
z = f(x + y)

在这个例子中你甚至没有真正处理一个闭包:x 这里实际上是一个全局变量。在 Python 中,只有当一个函数在另一个函数内部定义时才能创建闭包,并且顶级或模块全局命名空间不是函数。但同样的原则适用:全局变量显然可以在函数定义后改变,所以如果你想在函数定义时“锁定”它的值,你可以使用默认参数。

关于python - Python 与 ML 中的词法作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com