Использование глобальных переменных в функции

Вы не можете запустить / выполнить файл .exe, который находится локально на компьютере пользователя или через сайт. Пользователь должен сначала загрузить exe-файл, а затем запустить исполняемый файл.

2883
задан Aran-Fey 20 May 2018 в 10:47
поделиться

5 ответов

Можно использовать глобальную переменную в других функциях путем объявления этого как global в каждой функции, которая присваивает ему:

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

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

Видят другие ответы, если Вы хотите совместно использовать глобальную переменную через модули.

4001
ответ дан Matt 20 May 2018 в 20:47
поделиться
  • 1
    К сожалению, не берет свойства Вара (т.е. {{something.nested}} обеспечивает набор ([' something']) – Bemis 14 March 2014 в 04:37

Вы на самом деле не храните глобальное в локальной переменной, просто создав локальную ссылку к тому же объекту, к которому относится Ваша исходная глобальная ссылка. Помните, что в значительной степени все в Python - имя, относящееся к объекту, и ничто не копируется в обычной операции.

, Если Вы не должны были явно указывать, когда идентификатор состоял в том, чтобы относиться к предопределенному глобальному, затем необходимо будет, по-видимому, явно указать, когда идентификатор является новой локальной переменной вместо этого (например, с чем-то как команда 'var', замеченная в JavaScript). Так как локальные переменные более распространены, чем глобальные переменные в любой серьезной и нетривиальной системе, система Python имеет больше смысла в большинстве случаев.

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

18
ответ дан Peter Mortensen 20 May 2018 в 20:47
поделиться
  • 1
    Только для проверки ARC обработал бы память, обрабатывающую даже в этом случае прозрачно, правильно? – Joachim Isaksson 31 July 2012 в 21:11

Можно хотеть исследовать понятие пространства имен . В Python модуль является естественным местом для глобальный данные:

Каждый модуль имеет свою собственную частную таблицу символов, которая используется в качестве глобальной таблицы символов всеми функциями, определяемыми в модуле. Таким образом автор модуля может использовать глобальные переменные в модуле, не волнуясь о случайных столкновениях с user’s глобальные переменные. С другой стороны, если Вы знаете то, что Вы делаете, можно коснуться module’s глобальных переменных с той же нотацией, используемой для обращения к ее функциям, modname.itemname.

А определенное использование global-in-a-module описано здесь - , Как я совместно использую глобальные переменные через модули? , и для полноты содержание совместно используется здесь:

канонический способ поделиться информацией через модули в рамках единственной программы состоит в том, чтобы создать специальный модуль конфигурации (часто называемый конфигурация или cfg). Просто импортируйте модуль конфигурации во всех модулях Вашего приложения; модуль затем становится доступным как глобальное имя. Поскольку существует только один экземпляр каждого модуля, любые изменения, внесенные в объект модуля, отражаются везде. Например:

Файл: файл config.py

x = 0   # Default value of the 'x' configuration setting

: файл mod.py

import config
config.x = 1

: main.py

import config
import mod
print config.x
201
ответ дан Georgy 20 May 2018 в 20:47
поделиться
  • 1
    Это решение будет также составлять стилизованный текст, если стиль будет применен к тексту, прежде чем снимок будет взят? – Brendan 19 December 2013 в 02:32

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

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

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

56
ответ дан Peter Mortensen 20 May 2018 в 20:47
поделиться

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

Говорят, что у Вас есть модуль как это:

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

Вы могли бы, ожидая, что это распечатает 42, но вместо этого это печатает 5. Как был уже упомянут, если Вы добавите' global' объявление к func1(), то затем func2() распечатает 42.

def func1():
    global myGlobal
    myGlobal = 42

, Что продолжается, вот то, что Python берет то любое имя, которое является присвоено [1 113], где угодно в функции, локально для той функции, если явно не сказали иначе. Если это будут только [1 114] чтение с имени, и имя не существует локально, то это попытается искать имя в любом содержащем объемы (например, глобальная область видимости модуля).

, Когда Вы присваиваете 42 имени myGlobal, поэтому, Python создает локальную переменную что тени глобальная переменная того же имени. То локальное выходит из объема и , собрал "мусор" когда func1() возвраты; между тем, func2() ничего никогда не может видеть кроме (неизмененного) глобального имени. Обратите внимание, что это решение пространства имен происходит во время компиляции, не во времени выполнения - если бы необходимо было считать значение myGlobal внутренний func1() перед присвоением ему то Вы добрались бы UnboundLocalError, потому что Python уже решил, что это должна быть локальная переменная, но оно еще не имело никакого значения, связанного с ним. Но при помощи' global' оператор, Вы говорите Python, что он должен в другом месте искать имя вместо того, чтобы присвоить ему локально.

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

734
ответ дан Michael 20 May 2018 в 20:47
поделиться
  • 1
    @Urs снимок используется для принуждения передачи расположения CSS для Java 7. Я обновил свой ответ для дальнейшего объяснения этого. – jewelsea 24 April 2014 в 18:09
Другие вопросы по тегам:

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