Почему функция не видит глобальную переменную python
Перейти к содержимому

Почему функция не видит глобальную переменную python

  • автор:

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

Я предполагал, что когда интерпретатор дойдёт до строки print(s), он поймёт, что в области видимости функции foo такой переменной не существует. Следовательно начнёт искать её во внешней области видимости, но там она есть. Однако в результате в консоль выводится следующее сообщение об ошибке:

Traceback (most recent call last): File "index.py", line 7, in foo() File "index.py", line 4, in foo print(s) UnboundLocalError: local variable 's' referenced before assignment 

Проблема исчезает, если закомментировать строку

s = 'Reset global variable' 

но мне всё равно не понятен механизм
Отслеживать
48.9k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 16 мая 2019 в 6:18
rettoryh13 rettoryh13
181 1 1 серебряный знак 8 8 бронзовых знаков

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Марк Лутц — «Изучаем Python», глава 20, страница 596

Как известно, имена, которым выполняется присваивание внутри функции, по умолчанию рассматриваются как локальные – они располагаются в области видимости функции и существуют только во время работы функции. Но я еще не говорил, что локальные переменные определяются статически, во время компиляции программного кода в инструкции def, а не в соответствии с операциями присваивания, производимыми во время выполнения. Эта особенность становится причиной появления самых причудливых сообщений в группе новостей, получаемых от начинающих программистов. Обычно, если внутри функции имени не присваивается какое-либо значение, поиск его будет производиться в области видимости объемлющего модуля. Но посмотрите, что произойдет, если добавить инструкцию присваивания переменной X после ее использования.

X = 99 >>> def selector(): . print(X) # Переменная еще не существует! . X = 88 # X классифицируется как локальная переменная . # То же самое происходит при “import X”, “def X”. >>> selector() Traceback (most recent call last): . текст сообщения об ошибке опущен. UnboundLocalError: local variable ‘X’ referenced before assignment 

Было получено сообщение о том, что переменная не определена, но причина его появления не очевидна. Этот программный код компилируется интерпретатором во время ввода в интерактивной оболочке или во время импорта модуля. Вовремя компиляции Python обнаруживает операцию присваивания переменной X и делает вывод, что X – это локальное имя везде в теле функции. Но во время выполнения функции, из-за того, что к моменту вызова инструкции print операция присваивания еще не производилась, интерпретатор сообщает о том, что имя не определено. Согласно этому правилу использования имен, он говорит, что обращение к локальной переменной X произведено до того, как ей было присвоено значение. Фактически любая операция присваивания внутри функции создает локальное имя. Операция импортирования, =, вложенные инструкции def, вложенные определения классов и так далее – все трактуются именно таким образом. Проблема возникает из-за того, что операция присваивания делает имена локальными для всей функции, а не только для той ее части, которая следует за инструкцией присваивания.

Читать учебники — полезно.

Python почему не видит глобальную переменную?

Сам код большой так что кратко.
Код запускается с функции, сразу прописаны глобальные переменные «global XX» вот так, потом сразу даю «XX» значение 0,
после идут функции, которые используются в дальнейшем коде, в них есть XX, но при их вызове питон говорит что у него нету значения XX, почему ?
Просили код? вот пример, почему «a» не видит как переменную ?

def aa(): global a a=0 def bb(): if a==0: a=5 bb()

в этом случае скажет что у «a» нету значения

  • Вопрос задан более трёх лет назад
  • 1991 просмотр

2 комментария

Простой 2 комментария

Почему питон не видит переменную?

Author24 — интернет-сервис помощи студентам

Питон не видит переменную в функции
Здравствуйте! Не так давно начать разбирать в thinter. Пишу работу, где программа должна выводить 2.

Почему линкер не видит статическую переменную?
почему линковщик не видит статическую переменную: файл aaa.h class aaa < protected.

Не могу понять почему не видит компилятор переменную
Здравствуйте! using System; using System.Collections.Generic; using System.Linq; using.

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от stympel Посмотреть сообщение

Давно прогаю на питоне

Судя по коду — от силы неделю:
1) list это встроенная функция, поэтому знающий питонист никогда так не назовет переменную
2)

ЦитатаСообщение от stympel Посмотреть сообщение

питон не видит переменную SOME_VAR
потому что в коде она «замаскирована» другой (локальной) переменной с тем же именем.
Регистрация: 17.05.2017
Сообщений: 97

Сори, я уже часов 5 работаю и голова не варит.

Как сделать, чтобы эта переменная была видна?

P.S. большое спасибо, за авторитетную оценку меня))00))0)

Просто Лис

Эксперт Python

5474 / 3389 / 1030
Регистрация: 17.05.2012
Сообщений: 9,931
Записей в блоге: 9

ЦитатаСообщение от stympel Посмотреть сообщение

Как сделать, чтобы эта переменная была видна?

1 2 3
def function(self): global SOME_VAR # …

Но не надо так делать: глобальные переменные — зло.

Эксперт Python

4626 / 2046 / 361
Регистрация: 17.03.2012
Сообщений: 10,117
Записей в блоге: 6
Присоединяюсь, глобальные переменные — зло лютое.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Питон 3 на Cygwin не видит модуль
Здравствуйте. Столкнулся с проблемой при переносе проекта Python с Linux машины на Windows на.

Питон не видит модуль PIL
Модуль ставил через pip, в консоли он импортирует, в коде нет Питон 3.9.7 MS Visual Studio Code.

Питон не видит модуль после установки его через pip install
Здравствуйте, возникла необходимость установить udemy-dl. Команда pip install udemi-dl выполнилась.

Хром 56.0.2924.87 не видит табл.стилей а Лиса 4.0 Видит, почему?
Хром 56.0.2924.87 не видит табл.стилей а Лиса 4.0 Видит, почему? И как сделать, чтобы Хром видел.

почему Питон не переваривает кирилицу?
я новичок. столкнулся с принеприятнейшим моментом — комментарии в коде нужно отфильтровывать иначе.

Или воспользуйтесь поиском по форуму:

Глобальные переменные в классе

Author24 — интернет-сервис помощи студентам

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

И все бы хорошо, но теперь его требуется запускать из другого скрипта, которому требуются классы. Пример:
Само приложение:

1 2 3 4 5
global_var1 = [] global_var2 = {} def my_func1 () global_var1.append(global_var2) .

С использованием класса

1 2 3 4 5
# Где объявить глобальные переменные. class myClass: @staticmethod def my_func1 () global_var1.append(global_var2)

Вызов функции из другого скрипта:

from path import myClass myClass().my_func1()

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

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Глобальные и локальные переменные
def func3(): print(z) z = 20 z = 10 func3() Но ведь мы присвоили глобальной.

Глобальные переменные для всего проекта
У меня есть проект, в нем несколько питоновских файлов. Есть питоновский файл, в котором есть.

Глобальные и локальные переменные в компиляторе и интерпретаторе
x = 10 def foo(): print(x) x += 1 Почему функция foo() не выводит.

Глобальные переменные
Ребят. Добрый вечер. Не мог бы мне кто нибудь объяснить, в чем моя ошибка? Не обращайте внимание.

Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8

Лучший ответ

Сообщение было отмечено Jen948 как решение

Решение

Не понимаю, а что мешает обращаться к атрибутам класса?

1 2 3 4 5
class MyClass: def __init__(self): self.var = 2 print(MyClass().var)

Регистрация: 27.10.2013
Сообщений: 206
Спасибо, не догадался
И еще вопрос — как сделать import’ы в классе? Сейчас как будто их нет.
Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8
Можно поподробнее?
Регистрация: 27.10.2013
Сообщений: 206

1 2 3 4 5
class myClass: import os @staticmethod def my_func1 (): files = os.listdir(mypath)
myClass().my_func1()

И ошибка, как будто не было import os:
NameError: global name ‘os’ is not defined
Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8

А зачем импортировать внутри класса? 0_о

Добавлено через 17 секунд
Это противоречит PEP8

Регистрация: 27.10.2013
Сообщений: 206

Но ведь внутри класса используется тот же os.
Так как теперь можно обращаться только к функциям класса, я обращаюсь к функции, использующей os, а она этот os не видит

Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8
И можно узнать, что будет если вы импортируете библиотеку глобально?
Регистрация: 27.10.2013
Сообщений: 206

То есть импортирую в файле, в котором вызывается класс из другого файла, и этот класс увидит импорт?
___
Попробовал, работает.
Большое спасибо

Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8

Ну можно импортировать в конструкторе, но зачем? Не легче сделать импорт в том файле из которого вызываете?

Добавлено через 1 минуту

1 2 3 4 5 6 7
class MyOs: def __init__(self): import os self.name = os.name print(MyOs().name)

840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688

Jen948, импорты внутри функции делают только в случаи циклических импортов. В других случаях никогда так не делайте!

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Глобальные переменные
Помогите написать функцию check_sequence, которая возвращает строку «Новая», если ранее такой.

Глобальные и локальные переменные
Более того, при попытке обратиться к переменной сначала на чтение, потом на запись, мы получим.

Глобальные переменные в Django
Как лучше сделать глобальные переменные, к которым был бы доступ из всех вьюх? Спасибо

Глобальные Переменные из str в int
Доброго вечера. На код выдает ошибку: ValueError: size needs to be (int width, int height).

Глобальные переменные python kivy
Есть код рисовалки, подскажите как сделать так, чтобы принажатии кнопки "1" менялось значение rad? .

Глобальные переменные в блок-схеме
Люди, как обозначаются глобальные переменные в блок-схеме, не понимаю в каком порядке должен стоять.

Или воспользуйтесь поиском по форуму:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *