关于lambda表达式
当处于循环中的时候,以下四种情况返回值不符合预期的原因:
- button.clicked.connect(lambda: self.change_status(row_idx)) # 不行, 每次都是传入最新值
解读:
每次循环,lambda都是一个预定义的函数,并没有执行。等价如下:
1 | def 匿名函数(): |
因此,循环的结果就是相当于定义了多个无参的、使用外部参数计算结果的函数。
- button.clicked.connect(lambda r=row_idx: self.change_status®) # 不行, 每次都传入False
解读:
每次循环定义一个带有默认参数的函数,并没有执行。等价如下:
1 | def 匿名函数(r=row_idx): |
因此,如果循环了很多遍。再调用这个函数:
1 | # 第一种 |
- button.clicked.connect(lambda checked, r=row_idx: self.change_status®) # 行
解读:
每次循环定义一个带有一个参数checked, 一个默认参数r的函数。等价如下:
1 | def 匿名函数(checked, r=row_idx): |
此时调用,必须传入checked:
1 | 匿名函数(arg) |
此时必须传入一个参数,实际上传入的参数覆盖了checked的值,并没有覆盖r的值,r还是等于定义函数的时候的默认值。
- button.clicked.connect(partial(self.change_status, row_idx)) # 行
解读:
定义函数的时候设置默认值,不接受传入值。
总结:
pyqt在此处出现不符合预期的情况可能是:
- qt的connect不能传入参数。只能接受信号量携带过来的。
- 实际使用过程中,有传参的情况,会被传入一个值False。比如上述第二种情况,而第三种情况checked被赋值为False,r不受影响。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 水榭听泉!
评论
TwikooGitalk