gpt4 book ai didi

python - 为什么调用此 lambda 命令时字符串索引超出范围?

转载 作者:行者123 更新时间:2023-12-01 01:41:12 24 4
gpt4 key购买 nike

我将此函数作为 tkinter 计算器的一部分,以便通过单个函数生成所有计算器按钮,而不是逐一创建它们。我收到以下错误:

line 49, in <lambda>
button_list[i].configure(command = lambda: self.num_press(button_characters[i]))
IndexError: string index out of range

尽管使用的索引 (button_characters[i]) 工作正常,并且在设置按钮文本时在函数的早期阶段没有任何问题,但 lambda 在配置行上调用的索引会出现错误。 num_press 函数目前执行以下操作。

def num_press(self, num):
print(num)

有人可以帮助我并告诉我为什么该命令不起作用以及为什么它说索引超出范围吗?我在网上查了一下,没有找到任何东西。

最佳答案

问题是 lambda 表达式中的 button_list[i] 不是在创建 lambda 函数时而是在执行时计算并转换为字符。在您的情况下,这意味着每次您按下按钮时,它都会尝试访问 button_list[16],因为此时 i=16 。当您将 i 设置为不同的值时,您可以看到相同的行为:

def create_number_buttons(self):
button_characters = "789*456/123-0.=+"
i = 0
button_list = []
for row_counter in range(2,6):
for column_counter in range(4):
button_list.append(Button(root, pady=25, padx=35, text=button_characters[i]))
button_list[i].grid(row=row_counter, column=column_counter, sticky="NSEW")
button_list[i].configure(command=lambda : self.num_press(button_characters[i]))
i += 1
i=0

现在,每次按任意按钮,7 都会打印在屏幕上。由于执行 löambda 表达式时,i 的值为 0。您可以通过执行以下操作来规避该问题:

def create_number_buttons(self):
button_characters = "789*456/123-0.=+"
i = 0
button_list = []
for row_counter in range(2,6):
for column_counter in range(4):
button_list.append(Button(root, pady=25, padx=35, text=button_characters[i]))
button_list[i].grid(row=row_counter, column=column_counter, sticky="NSEW")
button_list[i].configure(command=lambda c=button_characters[i]: self.num_press(c))
i += 1

关于python - 为什么调用此 lambda 命令时字符串索引超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51870321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com