首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在函数内绑定对象值(闭包)

在函数内绑定对象值(闭包)
EN

Stack Overflow用户
提问于 2012-08-14 21:27:51
回答 4查看 361关注 0票数 3

在SML (我在Python之前学习的一种函数式编程语言)中,我可以执行以下操作:

代码语言:javascript
复制
val x = 3;
fun f() = x;
f();
>>> 3
val x = 7;
f();
>>> 3

然而,在Python中,第一次调用会给出3,第二次会给出7。

代码语言:javascript
复制
x = 3
def f(): return x
f()
>>> 3
x = 7
f()
>>> 7

如何在Python中将变量的值绑定到函数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-14 21:29:42

您可以使用关键字参数:

代码语言:javascript
复制
x = 3
def f( x=x ): 
    return x

x = 7
f()  # 3

关键字参数在创建函数时分配。当函数运行时,会在函数的作用域中查找其他变量。(如果它们没有在函数的作用域中找到,python将在包含该函数的作用域中查找变量,等等)。

票数 7
EN

Stack Overflow用户

发布于 2012-08-14 21:32:03

你可以这样做:

代码语言:javascript
复制
   x = 3
   f = lambda y=x: y
   f()
   >>> 3
   x = 7
   f()
   >>> 3
票数 2
EN

Stack Overflow用户

发布于 2012-08-14 22:04:31

正如mgilson和Neal一样,最直接的方法是在定义f时使用默认参数。

一个更大的问题是这里的哲学不匹配。Python支持闭包,但它们的操作方式将与SML (我不是特别熟悉)、Haskell或Clojure或其他东西(我更熟悉这两种语言)的操作方式不同。这是因为Python处理闭包的方式,也是因为它以不同的方式定义匿名函数并允许副作用。

通常,在函数式方法不能很好地工作的情况下,在Python中使用类,在本例中是用来捕获x的值。

代码语言:javascript
复制
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的值上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11953330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档