gpt4 book ai didi

python - 在 python 中创建 lambda 时,i=i 是什么意思?

转载 作者:太空狗 更新时间:2023-10-30 02:38:22 26 4
gpt4 key购买 nike

我从 Python hitchhikers guide 看到这个例子:

def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]

上面的示例是对延迟绑定(bind)引起的一些问题的解决方案,其中在调用内部函数时查找闭包中使用的变量。

i=i 是什么意思,为什么会造成如此大的差异?

最佳答案

它实际上不仅适用于 lambda;任何采用默认参数的函数都将使用相同的语法。例如

def my_range(start, end, increment=1):
ans = []
while start < end:
ans.append(start)
start += increment
return ans

(这实际上不是 range 的工作原理,我只是认为这是一个易于理解的简单示例)。在这种情况下,您可以调用 my_range(5,10),您将获得 [5,6,7,8,9]。但您也可以调用 my_range(5,10,increment=2),这将为您提供 [5, 7, 9]

您可以使用默认参数获得一些令人惊讶的结果。作为this excellent post描述的是,参数在函数定义处绑定(bind),而不是像您预期的那样在函数调用处绑定(bind)。这会导致一些奇怪的行为,但它实际上对我们有帮助。考虑您的链接中提供的错误代码:

def create_multipliers():
return [lambda x : i * x for i in range(5)]
for multiplier in create_multipliers():
print multiplier(2)

当您调用 multiplier(2) 时,它实际上在做什么?它接受您的输入参数 2,并返回 i * 2。但是 i 是什么?该函数在它自己的范围内没有任何名为 i 的变量,因此它会检查周围的范围。在周围范围内,i 的值就是您保留它的任何值 -- 在本例中为 4。因此每个函数都会给您 8。

另一方面,如果您提供默认参数,则该函数在其自己的范围内有一个名为 i 的变量。 i 的值是多少?好吧,你没有提供一个,所以它使用它的默认值,这是在定义函数时绑定(bind)的。当函数被定义时,i 对列表中的每个函数都有不同的值!

有点令人困惑的是,他们对参数变量使用了与迭代变量相同的名称。我怀疑您可以使用

获得具有更高可读性的相同结果
def create_multipliers():
return [(lambda x, y=i: y*x) for i in range(5)]

关于python - 在 python 中创建 lambda 时,i=i 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47165783/

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