Python ошибка связана со значением

File "C:\Users\Sam\Documents\Python\REYSEM.py", line 36, in callback cmd = cmd.replace(x, "").strip() ^^^ UnboundLocalError: cannot access local variable 'cmd' where it is not associated with a value

Помогите как исправить ошибку

Я пробовал перевести эту ошибку и пишет что не удается получить доступ к локальной переменной 'cmd', если она не связана со значением, а вот как развязать со значением я не знаю


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

Автор решения: Daniil Loban

Если очень коротко то причина в том что Вы забыли указать global перед использованием переменной cmd Этот код вызовет ту же ошибку:

cmd =''

def err():
  cmd = cmd.replace('x', "").strip() 

print(err())

File "/home/daniil/Desktop/demo.py", line 3, in yy cmd = cmd.replace('x', "").strip() UnboundLocalError: local variable 'cmd' referenced before assignment

Так это исправляется:

cmd =''
global cmd
def err():
  cmd = cmd.replace('x', "").strip() 

print(err())

Все внешние к функции переменные при их изменении внутри этой функции должны объявлятся в ней с global либо код можно написать так, но вызывать функцию нужно после того как переменная получит свое значение

cmd =''

def err(cmd = cmd):  # передача переменной через значение по умолчанию
  cmd = cmd.replace('x', "").strip() # работаем с локальной переменной
  return cmd

cmd = err() # обновление переменной объявленной в начале
print(cmd) 

Вообще так писать без надобности не рекомендуется, но я продемонстрировал в каких случаях global не нужен. Правда он так и не изменится если это скалярная переменная (потому что создастся внутренняя с таким же именем) если Вы делаете в этом случае return то все нормально

Иными словами когда Вы пишите global — Вы говорите Python что знаете что работаете с внешней переменной и хотите на нее повлиять, такое поведение не очень желательно, но иногда его можно применять.

Что касается самой ошибки то ее можно перевести примерно так:

Ошибка выходящей за ограничения переменной (под ограничениями понимается область функции): Не могу получить доступ к локальной переменной где она не ассоциируется со значением. В данном случае речь идет не про правую часть выражения а про левую.

cmd =''
def err():  # передача переменной через значение по умолчанию
    cmd.replace('x', "").strip() # работаем с локальной переменной
    return cmd

print(err()) 

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

→ Ссылка