python - Tkinter 绑定:如何理解 for 循环中的范围?
问题描述
似乎这里已经提出了这个问题:
但我不明白答案。这是同一问题的另一个代码示例:
如何理解 for 循环中的范围?
[edit]我的'orient'函数是这样定义的:[/edit]
orient = lambda snake, direction: snake.changeDirection(direction)
我尝试使用此循环分配 tkinter 绑定:
for player in Parameters.players:
snake = self.snakes[player]
self.root.bind(bindings[player]['up'], lambda event : orient(snake, Direction.N))
self.root.bind(bindings[player]['left'], lambda event : orient(snake, Direction.W))
self.root.bind(bindings[player]['down'], lambda event : orient(snake, Direction.S))
self.root.bind(bindings[player]['right'], lambda event : orient(snake, Direction.E))
但是这两个绑定被分配给最后一条蛇
所以我尝试“手动”执行循环:
player1 = Parameters.players[0]
snake1 = self.snakes[player1]
self.root.bind(bindings[player1]['up'], lambda event : orient(snake1, Direction.N))
self.root.bind(bindings[player1]['left'], lambda event : orient(snake1, Direction.W))
self.root.bind(bindings[player1]['down'], lambda event : orient(snake1, Direction.S))
self.root.bind(bindings[player1]['right'], lambda event : orient(snake1, Direction.E))
player2 = Parameters.players[1]
snake2 = self.snakes[player2]
self.root.bind(bindings[player2]['up'], lambda event : orient(snake2, Direction.N))
self.root.bind(bindings[player2]['left'], lambda event : orient(snake2, Direction.W))
self.root.bind(bindings[player2]['down'], lambda event : orient(snake2, Direction.S))
self.root.bind(bindings[player2]['right'], lambda event : orient(snake2, Direction.E))
它起作用了(每条蛇都有他的束缚)
lambda 函数是如何实际创建的?为什么它“捕获”变量并因此被覆盖而不是保持其值?
解决方案
最终代码是:
orient = lambda snake, direction: snake.changeDirection(direction)
for player in Parameters.players:
snake = self.snakes[player]
self.root.bind(bindings[player]['up'], lambda event, snake=snake : orient(snake, Direction.N))
self.root.bind(bindings[player]['left'], lambda event, snake=snake : orient(snake, Direction.W))
self.root.bind(bindings[player]['down'], lambda event, snake=snake : orient(snake, Direction.S))
self.root.bind(bindings[player]['right'], lambda event, snake=snake : orient(snake, Direction.E))
注意 lambda 定义中的“snake=snake”。
此处说明:在循环中创建函数
推荐阅读
- mysql - 将具有相同值但连接唯一值的所有行分组,多对多关系
- haskell - 四元数旋转有一个奇怪的行为(Haskell OpenGL)
- android - Galaxy S7 和 Galaxy S10e 的 TextView 文本大小差异
- swift - 无法在获取通知 userInfo 中转换类型的值
- php - 为什么我在 Laravel 迁移中遇到引用错误?
- python - 从python中的数据框形成所有可能的路径(列表/字典)
- gcc - CentOS8+gcc 8.3.1 的“编译器缺少 asm-goto 支持”问题
- html - 如何在 github 中发布包含多个 html 文件的作品集?
- python - 如何创建包含信息的嵌套字典。来自 csv 文件
- reactjs - 在 TypeScript 中使用上下文 API