Когда мне нужно использовать ключевое слово global в python

Хорошо, поэтому у меня была эта действительно раздражающая проблема, когда переменная была установлена ​​локально, но затем вне этой функции вернулась к ее старому «я» (в данном случае «Нет»), но в то же время я мог манипулировать другими переменными и все еще могу без использования ключевое слово «global».

Я не могу предоставить реальный код для этого, но он выглядит примерно так:

foo = {} foo_foo = {} bar = None def changes_foo(): ...do some stuff to foo... class EditThread(threading.Thread): def __init__(self): setup() def run(self): for key, value in foo.items(): do_update_task(key, value) def do_update_task(self, key, value): ...do some editing too foo... del foo[key] bar = [key, value] foo_foo[key] = value def print_the_bar(): print bar 

Имейте в виду, что все операции с foo_foo foo и foo_foo работают нормально, но при вызове print_the_bar все равно ничего не print_the_bar , но в моем коде было много операторов печати, чтобы убедиться, что строка внутри do_update_task действительно имеет правильные значения и isn Нет.

Может ли кто-нибудь объяснить мне, почему это так?

4 Solutions collect form web for “Когда мне нужно использовать ключевое слово global в python”

Когда вы делаете что-то для foo и foo_foo, вы не меняете ссылку:

 foo = {} foo['key'] = 'stuff' 

foo прежнему относится к тому же объекту, что и раньше; теперь он содержит больше данных.

 bar = ['key', 'value'] 

Это переназначает bar для ссылки на новый объект (список с двумя элементами).

Однако, когда эта строка встречается внутри функции, она создает локальную bar ссылок, если вы не говорите global bar . По сути, у вас есть две разные переменные с именем bar : глобальная и локальная.

Высказывание global bar говорит Python использовать глобальную версию bar а не создавать новую локальную переменную с тем же именем.

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

Или вы можете использовать класс:

 class State(object): def __init__(self): self.foo = {} self.foo_foo = {} self.bar = None state = State() def fn(): state.bar = ['key', 'value'] 

Если вам нужно только прочитать значение глобальной переменной в функции, вам не потребуется глобальное ключевое слово:

 x = 3 def f(): print x 

Если вы когда-либо устанавливаете значение глобальной переменной, вам нужно ключевое слово, чтобы вы не создавали локальную переменную:

 x = 3 def f(): global x x = 5 f() print x 

Переменные, которые вы определяете в функции, доступны только из тела этой функции.

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

Когда вы пытаетесь установить bar =[key, value] , новая переменная bar добавляется в пространство имен вашей функции. С этого момента bar ссылается на эту новую переменную, а не на глобальную.

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

  • Как проверить, является ли элемент списка списком (в Python)?
  • Невозможно загрузить пакеты из-за ошибки «Без модуля с именем wx»
  • Проблема с простым анализом в pyparsing
  • Каков самый простой способ перебора строк файла, поддерживающего счетчик?
  • отбрасывание «.0» из поплавков
  • Как получить родительский каталог в Python?
  • Запуск ноутбука ipython
  • Перестановка максимальных и минимальных значений в списке
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.