Например, обратите внимание, что первая версия обработчика из предыдущего раздела сама могла бы обратиться к переменной X непосредственно, так как она является глобальной (и будет определена к моменту, когда будет вызван обработчик). Благодаря этому мы могли бы написать обработчик, принимающий единственный аргумент, и передавать ему в lambda-выражении только строку ‘spam’:
def handler(A): # X находится в глобальной области видимости
…использование глобальной переменной X и аргумента A…
X = 42
Button(text=’ni’, command=(lambda: handler(‘spam’)))
Аргумент A также можно было бы перенести в глобальную область видимости, чтобы полностью устранить необходимость использования lambda-выражения; в этом случае мы сможем регистрировать сам обработчик и убрать промежуточную функцию.
Несмотря на всю простоту этого тривиального примера, на практике предпочтительнее использовать аргументы, а не глобальные переменные, потому что они делают внешние зависимости более очевидными, благодаря чему программный код проще будет понять и изменить. Один и тот же обработчик мог бы использоваться и в других контекстах, если не привязывать его к глобальным переменным. Пока мы не приступили к изучению крупных примеров, предъявляющих более сложные требования к сохранению информации о состоянии, вам придется принять на веру, что отказ от использования глобальных переменных в функциях обратного вызова и в графическом интерфейсе в целом, делает их более доступными для повторного использования и обеспечивает поддержку нескольких экземпляров в одной и той же программе. Причем такой подход рекомендутся применять не только в графических интерфейсах.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011