【发布时间】:2017-04-15 12:38:20
【问题描述】:
我正在尝试使用 lambda 函数和 python 3.6 中的一些 PyQt5 QPushButtons 将 9 个不同的按钮连接到一个处理程序。如果我使用整数单独分配它们,一切正常。但是,如果我尝试使用列表和循环,它们都被分配给按钮编号 10。我不明白为什么,因为我认为我的分配是整数值并且我的变量超出了范围.显然,这里发生了一些我不明白的事情。谁能解释这段代码的行为?
self.buttonList = [ self.sq1Button,
self.sq2Button,
self.sq3Button,
self.sq4Button,
self.sq5Button,
self.sq6Button,
self.sq7Button,
self.sq8Button,
self.sq9Button]
buttonNumber = 1
for button in self.buttonList:
button.clicked.connect(lambda: self.squareButtonHandler(buttonNumber))
buttonNumber += 1
【问题讨论】:
-
stackoverflow.com/questions/141642/… 如果你看这个问题,典型的 python 闭包似乎是只读的。闭包是一个 lambda,它从其范围之外引用一个变量。
-
你可以认为它类似于一个接受参数的对象,但它没有显式构造函数,而是隐含的 lambda。
-
@Novaterata - 有趣,但它们不一定是只读的。如果其他一些内部函数使用
nonlocal buttonNumber,它可以为每个人更改值。 -
是的,这似乎是该语言的新增功能,允许读/写闭包
标签: python lambda pyqt5 python-3.6