Ошибка "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 шт):
Я упрощу ваш пример до
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