Python闭包,默认参数不等于使用functools.partial的解决方案?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python闭包,默认参数不等于使用functools.partial的解决方案?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1414字,纯文字阅读大概需要3分钟。
内容图文
我正在使用PyQt在Python 3.2中做一个小游戏.我需要在菜单操作中插入几乎相同的操作,但使用其他参数.我发现我将使用lambda做到这一点,但事实证明所有动作都具有相同的参数.
事实证明这是一个关闭问题,我根据this post在其他SO问题上解决了.但是建议的一种解决方案(带有默认参数)应该与另一种等效,不能使用.当我对打印功能进行一点测试时,两个解决方案是相等的.
我想了解它为什么在这种情况下会有所不同.连接方法会以某种方式影响它吗?它可能与python作用域有关.这是我正在做的一小段(我省略了为动作指定名称和文本):
cardsOptions = [15, 30, 45, 50, 55, 60, 10]
self.startActions = []
lambdas = []
for co in cardsOptions:
action = QtGui.QAction(MainWindow)
self.menuNewGame.addAction(action)
# This works
# action.triggered.connect(partial(self.StartGame, 8, co))
lamb = (lambda a = co: self.StartGame(8, a))
lambdas.append(lamb)
# This doesn't work, when StartGame is called it gets arguments 8, false
action.triggered.connect(lamb)
self.startActions.append(action)
# This proves that closure was done ok, and it saved all co values
[m() for m in lambdas]
最让我惊讶的是,它把false作为第二个参数传递,就像他评估a = co一样?那么,使用默认参数的闭包与使用局部闭包的方式有何不同?
解决方法:
但是,如果您写:
[m(False) for m in lambdas]
它还将使用参数8,False调用StartGame.
Qt可能会使用参数False调用您的lambda,因此根本不使用lambda的默认参数.
但是你的想法很好.请尝试以下操作:
lamb = (lambda a, real_co = co : self.StartGame(8, real_co))
现在,只需简单地忽略False并使用real_co值.
内容总结
以上是互联网集市为您收集整理的Python闭包,默认参数不等于使用functools.partial的解决方案?全部内容,希望文章能够帮你解决Python闭包,默认参数不等于使用functools.partial的解决方案?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。