微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有迭代和Lambda的简单Python问题

如何解决带有迭代和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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?