Задать вопрос
@HexUserHex

Почему я получаю 'referenced before assignment'?

Приветствую,
сразу уточню что я в курсе что данная ошибка возникает в случае попытки использования переменной до ее определения.

Вот упрощенный код который работает только если я 'убираю строку' #start_id = f.readline():

#!/usr/bin/env python3
import os

start_id = 1

def main():
    print('start_id: ', start_id)

    if os.path.exists('./start_id.txt'):
        f = open('./start_id.txt', 'r')
        #start_id = f.readline()
        f.close()

if __name__ == "__main__":
    main()


Скажите почему?)
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Питон видит, что ты присваиваешь start_id что-то, и решает что это локальная переменная. А потом понимает, что ты выше её читаешь, и ругается. Это намеренное поведение, так как в противном случае либо:
а) до присваивания бы читалось значение глобального start_id, а после - локального,
б) глобальная переменная всегда изменялась бы вместо локальной, и появление новой глобальной переменной с тем же именем что и локальная где-то в функции приводило бы к её неожиданному изменению.
И то и то неочевидно и могло бы привести к "молчаливому"(без исключений) но неправильному поведению программы.

Если не присваивать, то локальной переменной start_id не существует, и чтение осуществляется из глобальной.

Если так надо менять глобальную переменную, то явно пропиши её в начале функции как global start_id.
А лучше не используй глобальные переменные без нужды. Если их более одной, стоит переделать это в класс.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы