Не работает функция global

Не работает функция global

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

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

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Читайте также:  Как настроить пуш уведомления втб айфон

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Источник

Руководство по глобальным переменным

Переменная, доступ к которой можно получить из любого места в коде, называется глобальной. Ее можно определить вне блока. Другими словами, глобальная переменная, объявленная вне функции, будет доступна внутри нее.

С другой стороны, переменная, объявленная внутри определенного блока кода, будет видна только внутри этого же блока — она называется локальной.

Разберемся с этими понятиями на примере.

Пример локальных и глобальных переменных

Переменная объявлена внутри функции и может использоваться только в ней. Получить доступ к этой локальной функции в других нельзя.

Для решения этой проблемы используются глобальные переменные.

Теперь взгляните на этот пример с глобальными переменными:

В этом коде были объявлены две глобальные переменные: a и b . Они используются внутри функций sum() и sub() . Обе возвращают результат при вызове.

Если определить локальную переменную с тем же именем, то приоритет будет у нее. Посмотрите, как в функции msg это реализовано.

Здесь была объявлена локальная переменная с таким же именем, как и у глобальной. Сперва выводится значение локальной, а после этого — глобальной.

Ключевое слово global

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

Правила использования global

  • Если значение определено на выходе функции, то оно автоматически станет глобальной переменной.
  • Ключевое слово global используется для объявления глобальной переменной внутри функции.
  • Нет необходимости использовать global для объявления глобальной переменной вне функции.
  • Переменные, на которые есть ссылка внутри функции, неявно являются глобальными.

Пример без использования глобального ключевого слова.

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

Здесь переменная c была объявлена в функции mul() с помощью ключевого слова global . Ее значение умножается на 10 и становится равным 100. В процессе работы программы можно увидеть, что изменение значения внутри функции отражается на глобальном значении переменной.

Источник

$GLOBALS[«моя переменная»] не работает

Подскажите люди добрые — почему может не работать $GLOBALS[«моя переменная»]?
Использую в header.php при перезагрузке страниц обнуляется.

Код
«; $GLOBALS[«моя переменная»] = что то

Установил последний битрикс Малый Бизнес

UPDATED — помог вызов такой функции определенной в init.php внутри header.php — global_session(«моя переменная»);

ТКНИТЕ ПЛИЗ ГДЕ ПОЧИТАТЬ что происходит И ЕСТЬ ЛИ В API BITRIX функции наподобие global_session

Цитата
Pyotr Gerasimov пишет:
Использую в header.php при перезагрузке страниц обнуляется.
Цитата
Руслан пишет:
а что мешает использовать $_SESSION, $_COOKIE ?
Цитата
Евгений Жуков пишет:
Цитата
Pyotr Gerasimov пишет:

Использую в header.php при перезагрузке страниц обнуляется.

Она и должна обнуляться. Если Вам необходимо передавать информацию при переходе по страницам или при обновлении текущей — выходов два:

Источник

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

Подскажите пожалуйста почему функция не выводит в консоль значение 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.15.40479

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

PHP: global внутри функции не показывает переменную

В теле метода класса подключается файл ($dataFile):

В подключаемом файле следующая логика:

Этот подключаемый файл последовательно выполняет код используя некоторые функции объявленные в нём же и в конце возвращает некий результат.

И вот проблема в том, что внутри функции getCountryTitle глобальная переменная $lang не видна, она null соответственно. Аналогично с другими переменными и другими функциями.

Смотрю под отладчиком — при выполнении логики в файле не заходя в функцию глобальные переменные инициализированы и всё хорошо. При заходе в функцию и объявляя их глобальными — они невидимы.

В чём может быть проблема?

1 ответ 1

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

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

Так в чем проблема-то?

Все предельно просто, вы делаете include внутри метода method, а значит переменные указанные в подключаемом файле инициализируются в области видимости метода method. Следовательно, переменная $lang не является глобальной, а ограничена видимостью метода, а вы обращаетесь к глобальной переменной, поэтому при использовании модификатора global она будет равна null.

Если делать include в глобальной области видимости, тогда переменная lang станет общедоступной (global) и ее использование станет возможным. Это легко проверить, достаточно в подключаемом файле перед началом определения какой-либо переменной написать global $переменная.

Пример:

  • file1.php определен в глобальной области видимости.
  • file2.php определен в локальной области видимости функции include2.

Подход с глобальными переменными и таким include — это костыль, который принесет вам проблем в будущем. Функции должны быть определены явно, иметь уникальное имя и выполняться по требованию.

А почему подход с глобальными переменными плохой?

Дело в том, что глобальные переменные видимы отовсюду, глобально. Это удобно: ведь нет никаких ограничителей. С другой стороны, становится совершенно невозможно отследить, кто меняет данные. Неконтролируемые изменения — это первое, что обычно приходит в голову на вопрос о том, чем же плохи глобальные переменные.

Предположим, у вас есть функция, результат которой зависит от глобальной переменной. Вы вызываете её, вызываете — но через 10 минут функция начинает возвращать неверные результаты. Что случилось? Ведь на вход вы передаёте ей всё тот же набор параметров? Гм, кто-то поменял значение глобальной переменной. Кто это мог быть? Да кто угодно — ведь глобальная переменная доступна всем..

Лучший рецепт при проектировании подпрограмм: сделать так, чтобы результат вашей функции зависел бы только от аргументов. Это идеал, к которому нужно стремиться.

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

Знаете какой наилучший префикс для глобальных переменных?

Источник

Оцените статью