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

Python 在循环中设置对象属性会导致所有属性具有相同的值,python,lambda,Python,Lambda,我试着把一些按钮连接到树莓圆周率上,当它们被按下时,会有不同的行为。我希望他们每个人在按下或松开按钮时都打印自己的姓名和状态。在本例中,我实例化了三个按钮,并在for循环中设置了按下按钮时的和释放按钮时的: #!/usr/bin/env python3 from gpiozero import LED, Button from signal import pause buttons = { "bcn": Button(2), "land": Button(3), "t

我试着把一些按钮连接到树莓圆周率上,当它们被按下时,会有不同的行为。我希望他们每个人在按下或松开按钮时都打印自己的姓名和状态。在本例中,我实例化了三个按钮,并在for循环中设置了按下按钮时的
和释放按钮时的

#!/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 ON
bcn OFF
。奇怪的是,当我重新启动脚本时,会选择另一个看似随机的名称,所有按钮都会报告,例如,
land ON
land OFF


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

将lambda更改为
lambda name=name:print(name+“ON”)
。在您的情况下,
名称
绑定到
上下文中的本地
名称