在循环中设置对象属性会导致所有属性具有相同的值

时间:2018-06-08 12:07:51

标签: python lambda

我正在尝试将一些按钮连接到Raspberry Pi,以便在按下它们时有不同的行为。我希望他们每个人在按下或释放按钮时打印他们的姓名和状态。在这个例子中,我实例化了三个按钮,并在for循环中设置了它们的when_pressedwhen_released属性:

#!/usr/bin/env python3

from gpiozero import LED, Button
from signal import pause

buttons = {
    "bcn": Button(2),
    "land": Button(3),
    "taxi": Button(4)
}

for name, btn in buttons.items():
    btn.when_pressed = lambda: print(name + ' ON')
    btn.when_released = lambda: print(name + ' OFF')

print('ready')
pause()

但是,当我按下按钮时,它们会报告正确的状态,但所有状态都会报告相同的名称。例如,所有按钮都可能会报告bcn ONbcn OFF。奇怪的是,当我重新启动脚本时,另一个 - 看似随机的名称被选择并且所有按钮都报告例如land ONland OFF

在我看来,它只是为所有按键处理程序创建一个lambda函数,并为所有发布处理程序创建一个。如何修改此脚本以打印每个按钮的正确名称?

1 个答案:

答案 0 :(得分:2)

将你的lambda改为lambda name=name: print(name + ' ON')。在您的情况下,name绑定到name上下文中的本地for值。