Python lambda作为常量仿函数

kar*_*na7 5 python lambda

我有代码与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]()
Run Code Online (Sandbox Code Playgroud)

输出:

('abc', '987')
('abc', '987')
('abc', '987')
Run Code Online (Sandbox Code Playgroud)

但是我需要:

('abc', 'xyz')
('123', '987')
('abc', '987')
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 10

这是一个众所周知的问题 - 因为你没有绑定p定义lambda时的当前值,当调用它时使用的当前值p.解决方案是使用带有默认值的命名arg来绑定"当前"(定义时间)值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]()
Run Code Online (Sandbox Code Playgroud)

  • 我不是说"这是一个众所周知的问题",而是更好地说,`一个lambda在被调用时被评估.由于所有lambdas都引用了在迭代期间发生变化的相同标识符`p`,因此它指向的最后一个对象是与所有lamba表达式相关联的对象. (2认同)