Python lambda一直都很有趣

2024-04-29 03:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我用labdas编写了代码,每次创建函数对象时都会检查它是不同的(不是引用同一个对象), 但它并不像我想象的那样有效。有什么方法可以或者应该用函子来做,即使我有常量数据插入lambda的体中?在

pairs = [('abc', 'xyz'), ('123', '987'), ('abc', '987')]

pairLambs = []

for p in pairs:
    pairLambs.append(lambda: print(p))

pairLambs[0]()
pairLambs[1]()
pairLambs[2]()

输出:

^{pr2}$

但我需要:

('abc', 'xyz')
('123', '987')
('abc', '987')

Tags: 数据对象方法lambda函数代码forabc
3条回答

如果您想“专门化”函数,您应该看看functools

import functools

pairs = [('abc', 'xyz'), ('123', '987'), ('abc', '987')]
pairLambs = []
for p in pairs:
    pairLambs.append(functools.partial(print, p))

这将产生您期望的结果。在

这就是python中闭包的工作原理。为了达到你想要的效果,你可以这样做:

 for p in pairs:
     def closure(_p):
         return lambda: print(_p)
     pairLambs.append(closure(p))

这是一个众所周知的问题-因为在定义lambda时,不绑定p的当前值,当调用它时,它使用当前值p。解决方案是使用带有默认值的命名参数绑定p的“当前”(定义时间)值:

pairs = [('abc', 'xyz'), ('123', '987'), ('abc', '987')]

pairLambs = []

for p in pairs:
    pairLambs.append(lambda p=p: print(p))

pairLambs[0]()
pairLambs[1]()
pairLambs[2]()

相关问题 更多 >