当前位置: 首页 > 面试题库 >

Python-循环创建函数

锺英彦
2023-03-14
问题内容

我正在尝试在循环内创建函数:

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)

问题在于所有功能最终都相同。这三个函数都没有返回0、1和2,而是返回2:

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]

为什么会发生这种情况,我应该怎么做才能获得分别输出0、1和2的3个不同函数?


问题答案:

你在后期绑定方面遇到了问题-每个函数都i尽可能晚地查找(因此,在循环结束后调用时,i将设置为2)。

可以通过强制早期绑定轻松修复:更改def f():def f(i=i):以下形式:

def f(i=i):
    return i

缺省值(右手i输入i=i是参数名的默认值,i左手i输入i=i)是在def时间而不是在call时间查找的,因此从本质上讲,它们是一种专门查找早期绑定的方法。

如果你担心要f获得额外的参数(因此有可能被错误地调用),则有一种更复杂的方法,其中涉及将闭包用作“函数工厂”:

def make_f(i):
    def f():
        return i
    return f

并在循环中使用f = make_f(i)而不是def语句。



 类似资料:
  • 问题内容: 我试图在迭代对象列表的循环内创建: 现在,如果我遍历lambda列表并这样称呼它们: 我得到相同的价值。这是最后的价值obj在,因为那是在列表迭代器的块中的最后一个变量。有什么想法可以很好地重写代码以使其正常工作吗? 问题答案: 使用此行:

  • 我试图研究我的数据中有零值的概率,我开发了一个代码,当一列数据为零时输出另一列数据的值,这正是我所需要的。但是,对于577BY29数据流中的每一列和其他28列都要这样做是很困难的,所以我决定创建一个for循环,在我有以下内容的地方为我这样做: 您可以看到,当输出数据帧有n=29列时,代码循环正确,但对于上面指定的条件,代码循环不正确。 请帮忙,谢谢!

  • 循环变量内建函数从 FreeMarker 2.3.23 版本开始存在。 这些内建函数只能用于list 和 items 指令 的循环变量 (也可以用于已经废弃的 foreach 指令)。 下面是一些说明(loopVar?index 在可以列表的值中进行迭代,返回从0开始的索引): <#-- Note: x is a loop variable --> <#list ['a', 'b', 'c'] a

  • 问题内容: 为什么在Java中引入此循环?它是Java创建的吗?它的目的是什么(提高内存/ cpu的使用效率)? 问题答案: 为什么在Java中引入此循环? 只是为了简化遍历通用集合和数组。代替 你可以做 这使得代码更具可读性和更好的可维护性。 它是Java创作吗? 不,它早于Java就以其他语言存在。Java实施起来相对较晚。 目的是什么? 请参阅第一个答案。 要了解更多信息,请查阅有关该主题的

  • 问题内容: 如何从while循环中创建sql server cte 这样的循环 问题答案: 如果需要表: 如果您需要一个字符串:

  • 我有以下代码: 这里的主要循环是: 但是我不确定这是最好的方法(如果我想输入什么,这是行不通的) 然后我试了这个: 但正如我所意识到的,这并不像我预期的那么快。所以问题是:创建主循环的最佳方法是什么?