Лямбда-итерация Python не работает должным образом

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

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 Solutions collect form web for “Лямбда-итерация Python не работает должным образом”

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

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

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

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

это снова и снова …

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

 for i in 0,1: def cmd(): return sys.stdout.write(str(i)) tk.Button(text="print '%d'"%i, command=cmd).pack() 
  • Действительно пользовательский шрифт в Tkinter
  • Многопоточность в Tkinter GUI, потоки в разных классах
  • Разница между импортированием tkinter как tk и из импорта tkinter
  • Каждый экземпляр класса Tk () работает независимо друг от друга?
  • Прозрачный холст в tkinter python
  • Как центрировать окно на экране в Tkinter?
  • Как создать прозрачные виджеты с помощью Tkinter?
  • Выполнение команды по минимизации окон в Tkinter
  • Python - лучший язык программирования в мире.