【debug】使用lambda在循环中传参时,参数总为同一个值

发现问题:

当我使用PyQt5在写一个文本处理小工具时,需要在调用事件时传入参数,于是想到了lambda函数,代码如下:

def radiotext(self):
    '''文档输出格式选择功能'''
    # 自动生成按钮并命名。其中count_button为存储按钮名称的列表,list_new为存储按钮显示文本的列表
    for count, ele_new in zip(count_button, list_new):
        # 生成按钮
        count = QPushButton(ele_new)
        # 关联self.format事件
        count.clicked.connect(lambda : self.format(ele_new))
        # 按钮样式布局
        self.hbox11.addWidget(count)

def format(self, str_select):
    '''根据格式按钮生成对应格式功能'''
    str = self.lineedit_format.text()
    str += str_select
    self.lineedit_format.setText(str)

当我执行工具时,发现生成的无论哪个按钮,显示文本都是同一个值,如下图:

分析问题:

后来查阅资料,才发现lambda函数(或称闭包)传递的不是参数的值,而是参数的物理地址,所以lambda传递的参数都会是同一个值。想要解决可以使用functools模块。

解决问题:

导入functools模块,使用partial方法。更改的代码如下:

# 函数工具模块
from functools import partial

def radiotext(self):
    '''文档输出格式选择功能'''
    # 自动生成按钮并命名。其中count_button为存储按钮名称的列表,list_new为存储按钮显示文本的列表
    for count, ele_new in zip(count_button, list_new):
        # 生成按钮
        count = QPushButton(ele_new)
        # 关联self.format事件
        count.clicked.connect(partial(self.format, ele_new))
        # 按钮样式布局
        self.hbox11.addWidget(count)

def format(self, str_select):
    '''根据格式按钮生成对应格式功能'''
    str = self.lineedit_format.text()
    str += str_select
    self.lineedit_format.setText(str)

最终成功传参:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值