在SML (我在Python之前学习的一种函数式编程语言)中,我可以执行以下操作:
val x = 3;
fun f() = x;
f();
>>> 3
val x = 7;
f();
>>> 3然而,在Python中,第一次调用会给出3,第二次会给出7。
x = 3
def f(): return x
f()
>>> 3
x = 7
f()
>>> 7如何在Python中将变量的值绑定到函数?
发布于 2012-08-14 21:29:42
您可以使用关键字参数:
x = 3
def f( x=x ):
return x
x = 7
f() # 3关键字参数在创建函数时分配。当函数运行时,会在函数的作用域中查找其他变量。(如果它们没有在函数的作用域中找到,python将在包含该函数的作用域中查找变量,等等)。
发布于 2012-08-14 21:32:03
你可以这样做:
x = 3
f = lambda y=x: y
f()
>>> 3
x = 7
f()
>>> 3发布于 2012-08-14 22:04:31
正如mgilson和Neal一样,最直接的方法是在定义f时使用默认参数。
一个更大的问题是这里的哲学不匹配。Python支持闭包,但它们的操作方式将与SML (我不是特别熟悉)、Haskell或Clojure或其他东西(我更熟悉这两种语言)的操作方式不同。这是因为Python处理闭包的方式,也是因为它以不同的方式定义匿名函数并允许副作用。
通常,在函数式方法不能很好地工作的情况下,在Python中使用类,在本例中是用来捕获x的值。
class F(object):
def __init__(self, x):
self.x = x
def __call__(self):
return self.x
x = 3
f = F(x)
f()
# 3
x = 7
f()
# 3这对于这个例子来说太过分了,我显然不推荐在这里这样做。但在Python中,答案通常是使用类。(这是一种严重的夸大,我的大脑产生异常的速度比我输入它们的速度还要快。但是,如果您来自函数式背景,我认为这句话是一个很好的启发式,因为您正在学习Pythonically式地处理问题。)
另外,有趣的是,这使得在函数参数定义中捕获变量的功能显式完成:它创建了一个函数对象,该对象在创建对象时挂起到x的值上。
https://stackoverflow.com/questions/11953330
复制相似问题