gpt4 book ai didi

Python - 迭代生成的 lambda 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:34 26 4
gpt4 key购买 nike

我在理解 Python 如何在运行时处理和评估 lambda 时遇到了一些困难。

迭代地构建一个整数

考虑以下代码(Python 3.5.2):

x = 0
for iteration in range(3):
x = x + 1
print(x)

正如预期的那样,这会打印 3。这是我对 x 在 3 次迭代中变化方式的理解:

  • 初始值: x
  • 迭代 1: x+1
  • 迭代 2: (x+1) + 1
  • 迭代 3: ((x+1) + 1) + 1

迭代构建 lambda

考虑以下代码:

add3 = lambda x: x
for iteration in range(3):
add3 = lambda x: add3(x) + 1
print(add3(0))

这是我对 add3 应该在 3 次迭代中改变的方式的理解:

  • 初始值: lambda x: x
  • 迭代 1: lambda x: (lambda x: x)(x) + 1
  • 迭代 2: lambda x: (lambda x: (lambda x: x)(x) + 1)(x) + 1
  • 迭代 3: lambda x: (lambda x: (lambda x: (lambda x: x)(x) + 1)(x) + 1)(x) + 1

相反,调用 add3 会导致超出最大递归深度。我的第一个想法是,Python 在调用时根据函数名称动态查找函数体,而不是将函数的代码存储为函数的一部分。但是,即使下面的代码也不起作用:

functionList = [lambda x: x] #Store each iteration separately
for i in range(3):
oldFunction = functionList[-1]
newFunction = lambda x: oldFunction(x) + 1 #Should be a completely new lambda object
functionList.append(newFunction)
print(functionList[-1](0)) #Causes infinite recursion

即使没有任何命名函数,并遵循建议 here (虽然我可能误解了他的答案),但它仍然失败:

functionList = [lambda x: x]
for i in range(3):
functionList.append(lambda x, i=i: functionList[-1](x) + 1)
print(functionList[-1](0)) #Causes infinite recursion

functionList 中包含的四个 lambda 是内存中完全独立的对象:

>>> print(functionList)
[<function <lambda> at 0x00000266D41A12F0>, <function <lambda> at 0x00000266D41D7E18>, <function <lambda> at 0x00000266D41D7730>, <function <lambda> at 0x00000266D41D7840>]

有人可以解释一下这种行为吗?

最佳答案

此行为与“迭代”lambda 生成无关。当您说 add3 = lambda x: add3(x) + 1 时,add3 对象将替换为递归调用自身的 lambda没有终止条件

所以当你调用add3(0)时,它会变成:

add3(0) = add3(0) + 1 = (add3(0) + 1) + 1 = ((add3(0) + 1) + 1) + 1

这种情况会永远持续下去(嗯,直到超过最大递归深度)。

<小时/>

至于其他示例,列表中的第二个函数已经失败,并出现 RecursionError:超出最大递归深度

我为您准备了此代码:

import copy

flist=[lambda x: x]
flist.append(lambda x: copy.deepcopy(flist[-1])(x) + 1)

>>> flist
[<function <lambda> at 0x101d45268>, <function <lambda> at 0x101bf1a60>]

因此,我们确保调用函数的副本flist[-1](0) 导致 RecursionError,并且该错误在 deepcopy 模块中引发。因此,这意味着 copy.deepcopy(flist[-1])(x) 意味着“复制列表中当前的最后一个元素并运行副本”。

就是这样:列表的最后一个元素一遍又一遍地调用自身。

关于Python - 迭代生成的 lambda 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38286166/

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