Лямбда-итерация Python не работает должным образом - PullRequest
1 голос
/ 01 июля 2010

В приведенном ниже коде я намерен иметь две кнопки, и при нажатии каждой из них «0» и «1» должны быть напечатаны на стандартный вывод соответственно. Однако, когда программа запускается, они оба выводят «1», что является последним значением, которое я имел в итерации for. Почему?

import Tkinter as tk
import sys

root = tk.Tk()

for i in range(0,2):
    cmd = lambda: sys.stdout.write(str(i))
    tk.Button(text="print '%d'" % i,command=cmd).pack()

root.mainloop()

Ответы [ 3 ]

5 голосов
/ 01 июля 2010

i не фиксируется в лямбде при его создании (как вы хотели).Вместо этого обе функции ссылаются на i во внешнем цикле for, который изменяется после создания функции и до ее запуска.Чтобы захватить его, вы можете использовать значение по умолчанию:

for i in range(0,2):
    cmd = lambda i=i: sys.stdout.write(str(i))
    tk.Button(text="print '%d'" % i,command=cmd).pack()
3 голосов
/ 01 июля 2010

Конечно, это проблема в

На лямбдах, захвате и изменчивости

, которая возникает снова и снова ...

1 голос
/ 01 июля 2010

Я думаю, что немного странно использовать анонимную функцию только для того, чтобы дать ей имя.Почему бы не написать это так?

for i in 0,1:
    def cmd():
        return sys.stdout.write(str(i))
    tk.Button(text="print '%d'"%i, command=cmd).pack()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...