- Почему назначение моих глобальных переменных не работает в Python?
- 5 ответов
- Почему из функции недоступна глобальная переменная?
- 3 ответа 3
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками python python-3.x python-faq или задайте свой вопрос.
- Связанные
- Похожие
- Подписаться на ленту
- Как работает global в python?
- Область видимости в Python
- Локальная область видимости
- Использование global в Python
- 3 ответа 3
Почему назначение моих глобальных переменных не работает в Python?
у меня ужасные проблемы с попыткой понять правила определения области python.
со следующим скриптом:
дает неожиданный (для меня) вывод:
где я ожидал бы, что последняя печать значения a будет 42, а не 7. Что мне не хватает в правилах области Python для области глобальных переменных?
5 ответов
глобальные переменные-это специальные. При попытке присвоить переменной a = value внутри функции он создает новую локальную переменную внутри функции, даже если есть глобальная переменная с тем же именем. Чтобы получить доступ к глобальной переменной, добавьте global сообщении внутри функции:
см. также именование и привязка для подробного объяснения правил именования и привязки Python.
трюк для понимания этого заключается в том, что когда вы назначаете переменной, используя=, вы также объявляете ее как локальную переменную. Таким образом, вместо изменения значения глобальной переменной a setA(value) фактически устанавливает локальную переменную (которая называется a) в переданное значение.
это становится более очевидным, если вы попытаетесь напечатать значение a в начале setA (value) следующим образом:
Если вы попытаетесь запустить этот Python, это даст вам полезный ошибка:
Это говорит нам, что Python решил, что функция setA(value) имеет локальную переменную, называемую a, которую вы изменяете, когда назначаете ей в функции. Если вы не назначаете a в функции (как с printA ()), то Python использует глобальную переменную A.
чтобы отметить переменную как глобальную, вам нужно использовать ключевое слово global в Python,в область, которую вы хотите использовать глобальную переменную. В данном случае, что в функция setA (value). Таким образом, сценарий становится:
это добавление одной строки сообщает Python, что при использовании переменной a в функции setA(value) вы говорите о глобальной переменной, а не о локальной переменной.
Python не имеет понятия переменных, как и другие языки. У вас есть объекты, которые находятся «где-то», и у вас есть ссылки на эти объекты. = используется для присвоения этих объектов ссылкам в настоящее пространство имен.
вы создаете имя a в пространстве имен функции setA, которая ссылается на объект, к которому относится значение.
внутри функции,a рассматривается как локальная переменная, вам нужно определить
Источник
Почему из функции недоступна глобальная переменная?
Подскажите пожалуйста почему функция не выводит в консоль значение s
Я предполагал, что когда интерпретатор дойдёт до строки print(s), он поймёт, что в области видимости функции foo такой переменной не существует. Следовательно начнёт искать её во внешней области видимости, но там она есть.
Однако в результате в консоль выводится следующее сообщение об ошибке:
Проблема исчезает, если закомментировать строку
но мне всё равно не понятен механизм
3 ответа 3
Марк Лутц — «Изучаем Python», глава 20, страница 596
Как известно, имена, которым выполняется присваивание внутри функции, по умолчанию рассматриваются как локальные – они располагаются в области видимости функции и существуют только во время работы функции. Но я еще не говорил, что локальные переменные определяются статически, во время компиляции программного кода в инструкции def, а не в соответствии с операциями присваивания, производимыми во время выполнения. Эта особенность становится причиной появления самых причудливых сообщений в группе новостей, получаемых от начинающих программистов. Обычно, если внутри функции имени не присваивается какое-либо значение, поиск его будет производиться в области видимости объемлющего модуля. Но посмотрите, что произойдет, если добавить инструкцию присваивания переменной X после ее использования.
Было получено сообщение о том, что переменная не определена, но причина его появления не очевидна. Этот программный код компилируется интерпретатором во время ввода в интерактивной оболочке или во время импорта модуля. Вовремя компиляции Python обнаруживает операцию присваивания переменной X и делает вывод, что X – это локальное имя везде в теле функции. Но во время выполнения функции, из-за того, что к моменту вызова инструкции print операция присваивания еще не производилась, интерпретатор сообщает о том, что имя не определено. Согласно этому правилу использования имен, он говорит, что обращение к локальной переменной X произведено до того, как ей было присвоено значение. Фактически любая операция присваивания внутри функции создает локальное имя. Операция импортирования, =, вложенные инструкции def, вложенные определения классов и так далее – все трактуются именно таким образом. Проблема возникает из-за того, что операция присваивания делает имена локальными для всей функции, а не только для той ее части, которая следует за инструкцией присваивания.
Читать учебники — полезно.
В вашем коде не хватает объявления, что вы планируете использовать глобальную переменную локально с помощью директивы global.
Операция присваивания делает имя s локальным для всей функции foo , а не только для ее части после присваивания. Это потому, что локальные переменные определяются во время компиляции, а не в соответствии с порядком операций использования и присваивания переменных во время выполнения функции.
Чтобы изменить глобальную переменную, передайте ее как аргумент в функцию и верните изменённое значение:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python python-3.x python-faq или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.18.40487
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Как работает global в python?
Доброго времени суток! Объясните мне пожалуйста как работает global внутри функции python-а? Что он в действительности делает. Вот у меня есть такая задача: внутри модуля есть переменная, и мне нужно из функции внутри класса менять эту переменную, которая одна на весь модуль будет, — могу ли я в этом случае использовать global module_var, — на какую область видимости распространяется global, до ближайшей найденной переменной или всё-таки на реальную глобальную область? Благодарю!
use nonlocal, Luke
А так global будет среди глобальных искать, см. доки
Ты хоть книжку почитай.
Бизли Д. Python. Подробный справочник. – Пер. с англ. – СПб.: Символ-Плюс, 2010. – 864 с., ил. ISBN 978-5-93286-157-8
Когда внутри функции создаются новые переменные, они имеют локальную область видимости. То есть такие переменные определены только в пределах тела функции, и они уничтожаются, когда функция возвращает управление вызывающей программе. Чтобы иметь возможность изменять глобальные переменные внутри функции, эти переменные следует определить в теле функции с помощью инструкции global
Методом научного тыка проверил — global ищет ближайшую по слою области видимости переменную и работает именно с ней, в глобальную область ничего не попадает. Так что global — это не global в обычном понимании. И по-моему его вполне можно использовать, если понимаешь что делаешь.
В моём понимании «глобальные переменные» — это нечто иное, это реально глобальные переменные, а не ближайшая по области видимости переменная, как в данном случае. Так что эта вырезка свет не проливает на истину, во всяком случае лично мне.
Источник
Область видимости в Python
Вы, наверное, не раз слышали термин область видимости, когда изучали программирование. Это весьма важная тема, незнание которой может привести к достаточно запутанным ошибкам. Область видимости указывает интерпретатору, когда наименование (или переменная) видимо. Другими словами, область видимости определяет, когда и где вы можете использовать свои переменные, функции, и т.д. Если вы попытаетесь использовать что-либо, что не является в вашей области видимости, вы получите ошибку NameError.
Python содержит три разных типа области видимости:
- Локальная область видимости
- Глобальная область видимости
- Нелокальная область видимости (была добавлена в Python 3)
Локальная область видимости
Локальная область видимости наиболее часто используется в Python. Когда мы создаем переменную в блоке кода, она будет разрешена при помощи ближайшей области видимости, или областей. Группирование всех этих областей известно как среда блоков кода. Другими словами, все назначения выполняются в локальной области по умолчанию. Если вам нужно что-то другое, тогда вам нужно настроить свою переменную на глобальную или нелокальную область, которые мы рассмотрим немного позже. Сейчас мы создадим простой пример, используя интерпретатор Python, в котором демонстрируется назначение локальной области видимости.
Источник
Использование global в Python
Здравствуйте, знакомлюсь с python и после c++ категорически не понимаю принцип использования global переменных. Если у переменной, находящейся в def указать global то можно ли её значение использовать вне этой функции, у меня точно не получается. Может просто потому что я новичок и очевидные вещи для меня еще слишком сложны.
Более опытные кодеры подскажите как исправить. SyntaxError: name ‘urokb_in’ is used prior to global declaration
3 ответа 3
Если вы хотите новую глобальную переменную создать/или переопределить старую внутри функции (не на глобальном уровне), то можно global использовать. Это может быть полезно при работе с multiprocessing модулем, чтобы унаследовать желаемые глобальные переменные от родительского процесса:
Если вы хотите просто использовать существующую глобальную переменную, не переопределяя её, то global не нужен (иначе к примеру, пришлось бы в каждой функции каждый используемый модуль, каждую глобальную функцию объявлять global).
я новичок и очевидные вещи для меня еще слишком сложны
Для новичков: не переопределяйте глобальные переменные вообще, то есть избегайте global . Считайте каждое появление global в коде ошибкой, если нет особых причин для использования этой конструкции (как в примере с multiprocessing ). Если не получается избавится от global, то создайте минимальный пример кода и задайте отдельный вопрос: «как избавиться от global, делая X»
Источник