【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_selectself.lineedit_format.setText(str)
当我执行工具时,发现生成的无论哪个按钮,显示文本都是同一个值,如下图:
分析问题:
后来查阅资料,才发现lambda函数(或称闭包)传递的不是参数的值,而是参数的物理地址,所以lambda传递的参数都会是同一个值。想要解决可以使用functools模块。
解决问题:
导入functools模块,使用partial方法。更改的代码如下:
# 函数工具模块
from functools import partialdef 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_selectself.lineedit_format.setText(str)
最终成功传参:
【debug】使用lambda在循环中传参时,参数总为同一个值相关推荐
- 【报错笔记】在maven项目中jsp页面使用window.location.href给controller传参时参数过长所以路径无法跳转至controller
在maven项目中jsp页面使用window.location.href给controller传参时参数过长所以路径无法跳转至controller 解决方案:使用a链接来用
- 关于SQL Server 2017中使用json传参时解析遇到的多层解析问题
原文:关于SQL Server 2017中使用json传参时解析遇到的多层解析问题 开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式. 用了快半年,在个人项目,以 ...
- v-for 循环 @click 动态传参(参数动态)
v-for 循环 @click 动态传参(参数动态) 代码示下: @click="function('id_'+data.id)" 以上就是关于"v-for 循环 @cl ...
- 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof
本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.3节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&qu ...
- python星号*在函数中、传参时的含义
函数中:将其他传入的元祖格式的数据,都纳入麾下 可参考:什么是*args和**kwargs?:https://blog.csdn.net/weixin_35757704/article/details ...
- python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法
C++和python混合编程 零.前言 一.说明 二.测试代码 1.C++代码 2.python代码 三.运行结果 零.前言 C++是一门高效率的语言,Python是一门简单易学的脚本语言,现在Pyt ...
- URL传参时 从URL中获取中文参数的方法
利用url传参时如果url中的参数是中文时因为编码类型不同在页面中获取会出现乱码 使用此方法能获取url中的参数值 并解决乱码问题 调用时直接 GetUrlByParamName("参数名& ...
- C++ 传参时传内置类型时用传值(pass by value)方式效率较高
来源:唐磊的个人博客<C++ 传参时传内置类型时用传值(pass by value)方式效率较高> 在<Effective C++>里提到对内置(C-like)类型在函数传参时 ...
- ajax 与route的区别,浅析vue-router jquery和params传参(接收参数)$router $route的区别
今天做项目时踩到了vue-router传参的坑(jquery和params),所以决定总结一下二者的区别. 1.jquery方式传参和接收参数 传参: this.$router.push({ path ...
最新文章
- Linux下C语言线程池的实现(1)
- 在博客园添加Lisp(或其它)代码高亮
- 递归实现显示目标文件夹的所有文件和文件夹,并计算目标文件夹的大小
- 1.2 偏差/方差-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- 如何快速将下载好的大量源代码文件加入到VS项目中
- 这样设置ae导出文件的时候m1还是能顶得住的,3分钟的事情渲染一个开场
- 《C#编程风格》还记得多少
- Codeforces Round #192 (Div. 2)
- Asp.Net Core 发布和部署( MacOS + Linux + Nginx )
- 「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld
- 上海服务器虚拟机系统,服务器虚拟机系统重装系统
- c 语言 小波变换,小波变换C语言
- C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8“的响应正文。...
- 阿里聚合直播盒子源码V10.x build更新日记
- 网络工程师和网络运维工程师,有什么区别?
- VR头显设备相关接口详解
- 常用的Markdown使用命令
- revit二次开发 创建标注标记
- 在校园网中进行无线路由器设置
- 阿里云天池大数据长期赛:金融风控-贷款违约预测(含代码)