天天看点

【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)
           

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

【debug】使用lambda在循环中传参时,参数总为同一个值发现问题:分析问题:解决问题:

分析问题:

后来查阅资料,才发现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)
           

最终成功传参:

【debug】使用lambda在循环中传参时,参数总为同一个值发现问题:分析问题:解决问题: