为什么只访问列表的最后一个元素?

时间:2018-02-09 00:43:32

标签: python arrays python-3.x for-loop tkinter

我正在尝试制作一个回合制的战斗系统,并且在尝试获取按钮以相对访问列表的元素时遇到了问题(按钮列表中的按钮访问另一个中的相同索引的元素列表)。但是,单击时,每个按钮仅访问列表的最后一个元素。以下是展示相同问题的简化示例代码:

from tkinter import *

root = Tk()

my_list = ['index 0', 'index 1', 'index 2']
buttons = []

for i in range(len(my_list)):
    buttons.append(Button(root, text='Button '+str(i), command=lambda: print(my_list[i])))
    buttons[i].pack()

据我所知,因为我在循环中执行此操作,所有按钮可能正在访问最后一个元素,因为它是i的最新值,但我无法找到另一种方式实现我的目标。为了更具体,并从上面的示例代码中提取,my_list表示角色可以采取的操作列表。 buttons中的每个按钮对应于其中一个操作(单击按钮设置您在转弯结束时执行的操作)。通常情况下,我可能会更明确地分配动作,但由于有多个战士,我选择使用循环并隐式执行,因为my_list经常更改以反映每个不同战斗机的动作。

我不清楚为什么会发生这种情况,我也想知道如何实现允许每个按钮访问my_list中相应元素的目标,因为它可能无法完成办法。感谢您阅读,如果我能为您澄清任何内容,请告诉我。

1 个答案:

答案 0 :(得分:0)

使用functools.partial代替lambda

from functools import partial
# ...
buttons.append(Button(root, text='Button '+str(i), command=partial(print, my_list[i])))