Лямбда-итерация 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() 
  • как создать прозрачный прямоугольник, реагирующий на событие click в Tkinter
  • Как реализовать шаблон MVC в Tkinter
  • изменение порядка элементов в списке tkinter
  • Измените OptionMenu на основе того, что выбрано в другом OptionMenu
  • Использование базовой карты как фигуры в графическом интерфейсе Python
  • как внедрить изображение в текстовый виджет
  • Python / ttk / tKinter - передача аргумента нажатием кнопки func?
  • Изображение не отображается на Tkinter
  • Как добавить местозаполнитель в Tkinter
  • Как подключить переменную к виджету Entry?
  • Выполнение команды по минимизации окон в Tkinter
  •  
    Interesting Posts for Van-Lav

    Python minidom / xml: как установить текст узла с помощью minidom api

    Как временно изменить sys.path в Python?

    Может ли параллельный тест Python проходить параллельно, как нос?

    Python рекурсивно заменяет символ в ключах вложенного словаря?

    Есть ли модуль Python для создания тестовых файлов определенных размеров?

    Список идентификаторов сообщений для чтения pylint?

    Документирование возвращаемого типа `tuple` в функции docstring для типа PyCharm

    Как получить ответ сервера после отправки почты с помощью smtplib SMTP.sendmail

    HTTP-сервер Python, поддерживающий закодированное кодирование?

    Как сделать rest_framework Serializer запретить лишние поля?

    py2exe не может импортировать модуль из другого каталога

    SQLite Performance Benchmark – почему: память: такая медленная … только в 1,5 раза быстрее, чем на диске?

    программирование с использованием pyclutter

    очень быстро получить общий размер папки

    Список Python: это лучший способ удалить дубликаты при сохранении порядка?

    Python - лучший язык программирования в мире.