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

标签 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。奇怪的是,当我重新启动脚本时,会选择另一个看似随机的名称,并且所有按钮都会报告例如着陆着陆

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

最佳答案

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

关于python - 在循环中设置对象属性会导致所有属性具有相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760338/

相关文章:

Python PDF 库

c++ - 正 lambda : '+[]{}' - What sorcery is this?

java - 在以下代码中使用 map 时出错

具有参数类型的 C# Func 委托(delegate)

java - 为什么 lambda 强制我使用单个元素数组而不是最终对象?

c++ - 如果编译器不支持,将可变参数传递给 lambda 表达式的解决方法

python - 使用 Python 快速排序

python - 无法在 Heroku 上上传我的 Flask 应用程序

python datetime现在没有夏令时

python - 有没有办法更改 Pygame 中导入的 .obj 文件的位置和大小?