lambda函数返回false

时间:2013-09-16 19:59:08

标签: python lambda pyqt

我在pyqt中有一个带有以下按钮的python程序:

this=[1,k]   
button.clicked.connect(lambda x=this:self.testFunction(str(x)))

当我按下按钮时,我得testFunction(False)而不是testFunction(str([1,k]))。有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

原因是你错误地解释了lambda的工作原理。 Lambda返回一个匿名函数,其中包含您给出的定义。通过说lambda x=this:,如果对此函数的调用没有x参数,则默认使用此参数。

观察:

l = lambda x=3: x*2
print l(10)  # Prints 20
print l()    # Prints 6

如果我们查看QPushButton.clicked() (inherited from QAbstractButton)的文档,我们会看到它使用布尔参数触发。

所以在这一行:

button.clicked.connect(lambda x=this:self.testFunction(str(x)))

lambda函数总是传递一个参数,该参数从QPushButton.clicked()传递,并且可以是TrueFalse。因此,永远不会使用默认值this。作为替代方案,您可以使用:

button.clicked.connect(lambda x:self.testFunction(str(this)))

但这可能不是你想要的,因为它总会将数组的字符串变量传递给函数。另一方面,这个:

button.clicked.connect(lambda x:self.testFunction(str(this[x])))

将根据传递的参数是1还是k来传递其TrueFalse的字符串转换。