Как присвоить переменной ее старое значение + строчные данные?

Делаю логи нажатых клавиш для моей игры, нужно чтобы программа комбинировала старое значение переменной с новым в .txt документе, т.е: Logs\n => Logs\n + key "1" pressed => Logs\nKey "1" pressed.

Когда данные о нажатиях выводятся в консоль и без соединения старого значения с новым все нормально, а когда пытаюсь скомбинировать два значения... Выходит ошибка "UnboundLocalError: local variable 'whenaoutput' referenced before assignment". Как это решить?

import keyboard
import datetime as dt
tost=1
my_file = open(f"log.txt", "w+")
whenaoutput='Логи клавиш:\n'
def print_pressed_keys(e):
    if e.name!='':
        dt_string = dt.datetime.now()
        strim=f'\n{dt_string} | Клавиша {e.name} нажата!'
        whenaoutput=whenaoutput + strim
        my_file.write(f"{whenaoutput}")
while tost<999:
    tost+=2
    keyboard.hook(print_pressed_keys)
    keyboard.wait()
my_file.close()

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

Автор решения: Pokruk

Перезаписывая переменную whenaoutput в функции print_pressed_keys, вы на самом деле "затеняете" глобальную переменную локальной, что означает, что внутри функции к глобальной переменной доступ получить никак не получится. Поведение с затенением переменной можно избежать ключевым словом global, которое будет означать, что вы хотите присвоить значение глобальной переменной.

a = 5
def foo():
    global a
    a = a + 1

Может возникнуть закономерный вопрос, а что если у вас будет функция в функции, и вам нужно будет присвоить значение переменной, которая не глобальная, а принадлежащая функции на уровень выше, то что делать? Для таких случаев есть ключевое слово nonlocal

def bar():
    a = 5
    def foo():
        nonlocal a
        a = a + 1
    foo()
→ Ссылка