【问题标题】:What does get to appended to the functions list (what's inside the func(x))将什么附加到函数列表(func(x) 中的内容)
【发布时间】:2021-06-03 19:27:55
【问题描述】:

这段代码打印 [16,16,16,16,16]。

functions = []
for i in range(5):
    def func(x):
        return x + i
    functions.append(func)
for f in functions:
    print(f(12))

在第一个 for 循环中,当 i 取值 3 时,被追加到列表的 func 内部是什么? func(x):x+3func(x):x+ifunc(x): x+i where i=3 ?

我假设答案是func(x):x+i,其中i 在附加到列表时不带任何实际值。有人可以使用框架、闭包和范围概念向我解释吗?当i = 3在父框架中时,为什么func(x)不附加为x+3

【问题讨论】:

  • 为什么不附加实际值,因为该值在父框架中

标签: python python-3.x scope closures


【解决方案1】:

使用默认参数:

functions = []
for i in range(5):
    def func(x, a = i):
        return x + a
    functions.append(func)
for f in functions:
    print(f(12))

这是可行的,因为在创建函数时会评估默认值。否则所有函数都会指向i的最后一个值。

请随时查看Late Binding Closures 了解更多信息。

Python 的闭包是后期绑定的。这意味着在调用内部函数时会查找闭包中使用的变量的值。

这里,每当调用任何返回的函数时,都会在调用时在周围的作用域中查找 i 的值。到那时,循环已经完成,i 的最终值为 4。

指南中的示例使用range(5),因此引用直接适用于您的函数。

【讨论】:

  • 不,在这种情况下,它在函数执行时进行评估,因此它们都得到相同的 i4
  • 哦不,抱歉,我没有看到您实际上提供了 i 作为参数。不,你的代码很好。
  • 稍微简化一下,它就像一个包含 5 个相同变量的列表 [x,x,x,x,x]。所以如果你改变x的值,所有的元素都会改变。(因为他每次都使用相同的函数名)。
  • @jazzfaz 我添加了一个更详细解释的链接。
  • 在闭包方面,当func(x)添加到列表中时,它是一个闭包,这里存储了一个函数。并且每次迭代都会更新该闭包的本地值。所以当你调用函数的时候,局部变量i已经更新到最新的值了。
【解决方案2】:

另一个选项是高阶函数。

functions = []

for i in range(5):
    def func_maker(i):
        def _func(x):
            return x + i
        return _func

    functions.append(func_maker(i))

for f in functions:
    print(f(12))

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多