Ошибка "UnboundLocalError: cannot access local variable" при использовании во внутренней функции перенных обрамляющей функции

При попытке определить переменные a и b в if c == a + b повторно (обновить) происходит ошибка

cannot access local variable 'a' where it is not associated with a value.

Мне нужно обновлять данные, чтобы пример менялся в дальнейшем через label[text]=f'{a} + {b} = ?'

А проверка на истинность, чтобы вывести через label в дальнейшем верность ответа

from tkinter import *
from tkinter import ttk
import random

def main():
    a = random.randint(1, 10)
    b = random.randint(1, 10)
    print(a, b)

    def finish():
        window.destroy()
        print("приложение закрыто")
        # os.abort()

    def update_example(event):
        c = int(en_example.get())
        if c == a + b:
            a = random.randint(1, 10)
            b = random.randint(1, 10)
            print('правильно')
        else:
            print('неправильно')

    window = Tk()
    window.geometry('800x600+560+240')
    window.resizable(width=False, height=False)
    window.protocol('WM_DELETE_WINDOW', finish)

    s = ttk.Style()
    s.configure('my.TButton', font=('Arial', 30))
    s.configure('my.TLabel', font=('Arial', 30))

    frame = Frame(window, padx=10)
    frame.pack(expand=True)

    label_example = ttk.Label(frame, text= f'{a} + {b} = ?', style='my.TLabel')
    label_example.grid(row=1, column=1)

    en_example = ttk.Entry(frame, font=('Arial', 30), width=3)
    en_example.grid(row=1, column=2)

    en_example.bind('<Return>', update_example)


    window.mainloop()

if __name__ == '__main__':
    main()

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Я упрощу ваш пример до

def f():
    x = 0

    def g():
        print(x) # print global value
        x = 42
        print(x) # print local value

    g()


f()

Если запустить, получим

$ python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 12, in <module>
    f()
  File "/home/sv/desk/stackoverflow/temp.py", line 9, in f
    g()
  File "/home/sv/desk/stackoverflow/temp.py", line 5, in g
    print(x) # print global value
          ^
UnboundLocalError: cannot access local variable 'x' where it is not associated with a value

Компилятор Питона анализирует текст функции g и для каждого символа принимает решение, локальный он или нет. В примере таких символов два: print и x. print становится не локальным, x – локальным. Разница вызвана тем что в коде g есть присвоение значения переменной x, а для print такого присвоения нет.

Если компилятор решил что x локальный, он не будет искать значения для x вне функции g. Такое правило позволяет компилятору исполнять код быстрее. Теперь смысл ошибки становится ясным: x локальная переменная, а попытка печати делается до того как локальный x получил значение.

Чтобы исправить ошибки, надо указать компилятору что x не локальная переменная:

def f():
    x = 0

    def g():
        nonlocal x
        print(x) # print global value
        x = 42
        print(x) # print local value

    g()


f()
$ python temp.py
0
42
→ Ссылка