weranda
@weranda

Почему в Python нельзя вывести значение глобальной переменной в функции перед ее затенением?

Приветствую

Вопрос из разряда теоретических. Не понимаю логику работы простой функции.
Имеется:
– глобальная переменная
– функция
– локальная переменная

Пример:
def x():
	print(a)
	a = 2

a = 1
x()


Серьезно, не пойму логику. Имеется переменная а со значением 1. В функции х вызывается значение глобальной переменной a. Если же далее попытаться затенить глобальную переменную а, то возникает ошибка, гласящая о том, что пытаюсь обратиться к локальной переменной до присвоения ей значения. Но я же пытаюсь сначала вывести значение глобальнрой переменной, а потом затенить глобальную переменную.

Мне понятно, что правило такое, но верно ли оно логически?
Могли бы разъяснить ситуацию?
  • Вопрос задан
  • 723 просмотра
Решения вопроса 1
@newpy
web-dev
В функции х вызывается значение глобальной переменной a.

вы пришли из JavaScript?
у вас пробел в областях видимости в питоне.

у вас внутри функции x(),
пытаюсь обратиться к локальной переменной до присвоения ей значения

потому что вы пишите print(a) ДО того как присваиваете ей значение. Функция x() ничего не знает о той переменной "a" которая равна 1.
def x():
  # внутри функции ничего неизвестно о переменной а = 1 которая снаружи.
  # чтобы было известно надо использовать ключевое слово global, или передавать напрямую ваше    "а" = 1, в функцию x(a) 
  print(a) # ошибка тут. Выводите раньше чем присвоили значение.
  a = 2

a = 1
x()


Чтобы работало
def x():
    global a
    print(a)
    a = 2
a = 1
x()

x() # выведет 1
print(a) # выведет 2
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@lega
Потому что переменная существует на старте функции, т.е. под имя "a" уже выделена локальная ячейка.
js работает так же.

Хз правильно или нет, как минимум это проще реализовать, ну и может это спасает от каких-нибудь неявных ошибок, например что-б не перепутать в коде глобальные и локальные с одним именем.
Ответ написан
Комментировать
Срабатывает, если перед print вписать:

global a

В моей практике ни разу не потребовалось делать подобное.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы