You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环生成卡片点击异常:始终触发最后一条数据

问题原因与解决方案

这是Python lambda在循环中的延迟绑定导致的问题:循环内定义的lambda并不会立即捕获当前迭代的ci值,而是持有对变量ci的引用。当循环结束后,ci最终指向最后一条记录的身份证号,因此无论点击哪个卡片,触发的lambda都会使用这个最终值。

以下是三种可行的解决方法:

方法1:利用lambda默认参数捕获当前值

修改on_click的lambda定义,通过默认参数把当前迭代的ci值固定下来:

on_click=lambda _, current_ci=ci: self.seleccionarJefe(current_ci)

默认参数会在lambda定义时(即每次循环迭代时)计算并保存当前的ci值,而非等到调用时再读取变量引用。

方法2:使用functools.partial固定参数

导入functools模块,用partial直接绑定固定参数:

from functools import partial

# 循环内修改on_click配置
on_click=partial(self.seleccionarJefe, ci)

partial会将当前的ci值直接绑定到函数参数上,彻底避免引用延迟的问题。

方法3:封装成内部函数生成卡片

把创建卡片的逻辑拆成内部函数,利用闭包特性捕获当前值:

def generarCards(self, pagee):
    pagee = pagee
    cartas = []

    querySelectJefe = "SELECT nombre, apellido, ci FROM jefesf"
    resultado = logica.consulta(querySelectJefe)

    def crear_carta(nom, ape, ci):
        return Container(
            bgcolor="RED",
            height=150,
            width=250,
            border_radius=border_radius.all(20),
            on_click=lambda _: self.seleccionarJefe(ci),
            content=Column(
                controls=[
                    Text(f"{nom} {ape}"),
                    Text(f"{ci}"),
                ]
            )
        )

    for nom, ape, ci in resultado:
        cartas.append(crear_carta(nom, ape, ci))
        pagee.update()

    return cartas

每次调用crear_carta时,函数参数ci会保存当前迭代的数值,lambda引用的是这个局部变量,不会受后续循环的影响。

内容的提问来源于stack exchange,提问作者Diego Marin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:39:56