如何解决带有迭代和Lambda的简单Python问题
lst = [1,2,3]
i = 0
f = lambda x: x * lst[i]
i = 1
print(f(10))
f = lambda x: x * lst[i]
i = 2
print(f(10))
f = lambda x: x * lst[i]
上面是我的Python代码,我认为它会打印出10,20
,但显示为20,30
。我不明白为何f
会被i
修改,而不管显式分配如何。我必须使用迭代使其打印10,20
(实际上,代码是原始代码的简化形式),因此似乎不允许f = lambda x: x * 1
。
解决方法
我认为您期望f = lambda x: x * lst[i]
存储i
的值,但这种方式行不通。定义函数时,仅将其存储以供以后使用,定义函数时不对其进行评估。仅在调用它时对其进行评估。
因此,当您第一次调用f(10)
时,您将x
的值传递为10,解释器在内存中查找i
的值,即第一个函数调用期间为1
,第二个函数调用期间为2
。这就是为什么您得到20 30
作为输出的原因。
如果您仍有疑问,请随时提问。
, i
是全局变量。因此,当您调用f
时,它将使用i
的当前值
看看
f = lambda x: x * lst[i]
lst = [1,2,3]
for i in range(len(lst)):
print(f(10))
输出
10
20
30
请注意,与您的问题无关,但f = lambda x: x * lst[i]
反对PEP8 recommendations:
,始终使用
def
语句,而不是使用 直接将lambda表达式绑定到标识符:正确:
def f(x): return 2*x
错误:
f = lambda x: 2*x
第一种形式表示结果函数对象的名称为 特别是'f'而不是通用''。这更多 通常对于回溯和字符串表示很有用。使用 赋值语句的注释消除了lambda的唯一好处 表达式可以提供显式的def语句(即它可以 嵌入更大的表达式中
将lambda表达式想象为一个真正的函数,因此您将获得以下代码:
lst = [1,3]
i = 0
def f(x):
return x * lst[i]
i = 1
print(f(10)) # currently x=10 and i=1
def f(x):
return x * lst[i]
i = 2
print(f(10)) # currently x=10 and i=2
def f(x):
return x * lst[i]
我知道你的意思。在您定义lambda x: x * lst[i]
的过程中,您认为数字i
会在此时被冻结-就像分配一样。以后调用时,数字i
将始终是第一个值。这不是真的。调用此函数时,将引用i
的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。