Я знаю, что в первую очередь следует избегать использования глобальных переменных из-за путаницы, подобной этой, но если бы я использовал их, является ли следующий правильный способ их использования? (Я пытаюсь вызвать глобальную копию переменной, созданной в отдельной функции.)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
Имеет ли то, x
что вторая функция использует то же значение глобальной копии, x
что func_a
использует и изменяет? При вызове функций после определения имеет ли значение порядок?
python
global-variables
Акшат Шехар
источник
источник
Ответы:
Если вы хотите просто получить доступ к глобальной переменной, просто используйте ее имя. Однако, чтобы изменить его значение, вам нужно использовать
global
ключевое слово.Например
Это изменило бы значение глобальной переменной на 55. В противном случае это просто присвоило бы 55 локальной переменной.
Порядок списков определений функций не имеет значения (при условии, что они каким-то образом не ссылаются друг на друга), порядок их вызова имеет значение.
источник
x
infunc_B
- это локальная переменная, которая получает свое значение из возвращаемого значения вызоваfunc_A
- так что я предполагаю, что это сделает его вашим (2)func_A
глобальная переменная изменяется во время каждого запуска и возвращаетсяfunc_B
к использованию, тоfunc_B
каждый раз будет работать с измененным значением. Я не уверен насчет твоего "как это исправить". Вы можете принять наиболее полезный ответ на свой текущий / оригинальный вопрос, а затем рассмотреть вопрос об открытии другого вопроса о том, что выглядит как дополнительный вопрос.x.append("...")
, это глобальная переменная x, которая изменяется, потому что локальная ссылается на глобальную.В пределах области Python любое присвоение переменной, еще не объявленной в этой области, создает новую локальную переменную, если только эта переменная не была объявлена ранее в функции как ссылка на глобальную переменную с ключевым словом
global
.Давайте посмотрим на модифицированную версию вашего псевдокода, чтобы увидеть, что происходит:
Фактически, вы можете переписать все
func_B
с именованной переменной,x_local
и она будет работать одинаково.Порядок имеет значение только в той степени, в которой ваши функции выполняют операции, которые изменяют значение глобального x. Таким образом, в нашем примере порядок не имеет значения, так как
func_B
вызываетfunc_A
. В этом примере порядок имеет значение:Обратите внимание, что
global
требуется только для изменения глобальных объектов. Вы по-прежнему можете получить к ним доступ из функции без объявленияglobal
. Таким образом, мы имеем:Обратите внимание, что разница между
create_locally
иaccess_only
-access_only
заключается в доступе к глобальному x, несмотря на то, что он не вызываетсяglobal
, и даже еслиcreate_locally
он не используетсяglobal
, он создает локальную копию, так как присваивает значение.Путаница здесь заключается в том, почему вы не должны использовать глобальные переменные.
источник
Как уже отмечали другие, вам нужно объявить переменную
global
в функции, когда вы хотите, чтобы эта функция могла изменять глобальную переменную. Если вы хотите получить к нему доступ, то вам это не нужноglobal
.Если говорить более подробно об этом, то, что означает «изменить», заключается в следующем: если вы хотите повторно связать глобальное имя, чтобы оно указывало на другой объект, имя должно быть объявлено
global
в функции.Многие операции, которые изменяют (изменяют) объект , не привязывают глобальное имя, чтобы указывать на другой объект, и поэтому все они действительны без объявления имени
global
в функции.источник
Вот один случай, который меня поймал, используя глобальное значение параметра по умолчанию.
Я ожидал, что param будет иметь значение 42. Сюрприз. Python 2.7 оценивал значение globVar при первом анализе функции func. Изменение значения globVar не повлияло на значение по умолчанию, назначенное параметру. Задержка оценки, как в следующем, работала так, как мне было нужно.
Или, если вы хотите быть в безопасности,
источник
is
для проверки, если что-тоNone
, вместо обычного сравнения==
.Вы можете напрямую получить доступ к глобальной переменной внутри функции. Если вы хотите изменить значение этой глобальной переменной, используйте «имя глобальной переменной». Смотрите следующий пример:
Вообще говоря, это не очень хорошая практика программирования. Нарушая логику пространства имен, код может стать трудным для понимания и отладки.
источник
Вы должны использовать
global
объявление, когда хотите изменить значение, назначенное глобальной переменной.Вам не нужно это читать из глобальной переменной. Обратите внимание, что вызов метода для объекта (даже если он изменяет данные в этом объекте) не изменяет значение переменной, содержащей этот объект (отсутствует отражающая магия).
источник
xs.append(xs.pop(0))
работает просто отлично безglobal xs
.