Лямбда-итерация 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() 

  • в чем разница между python между лямбдой и регулярной функцией?
  • Pandas dataframe добавляет поле, основанное на нескольких операторах if
  • Может ли Python раскрыть лямбда-функции?
  • Команда Tkinter назначить кнопку в цикле с лямбдой
  • Удаление дубликатов с использованием только лямбда-функций
  • аргументы с распаковкой лямбда
  • Редактирование объекта сериализатора django-rest-framework перед сохранением
  • Использовать массив numpy в общей памяти для многопроцессорности
  • улавливать определенную ошибку HTTP в python
  • Пример реального мира о том, как использовать свойство свойства в python?
  • Декораторы Python, которые являются частью базового класса, не могут использоваться для украшения функций-членов в унаследованных классах
  • Что возвращает Python socket.recv () для неблокирующих сокетов, если данные не получены до истечения тайм-аута?
  • 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() 
    Python - лучший язык программирования в мире.