Глобальные переменные модуля Python и глобальные переменные __init__

StackOverflow https://stackoverflow.com/questions/933042

  •  06-09-2019
  •  | 
  •  

Вопрос

Извиняюсь, несколько запутанный вопрос для новичков в Python.Допустим, у меня есть модуль под названием animals.py.......

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

В чем разница между этим и

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

Предполагая, что я всегда сначала создаю экземпляр собаки?

Думаю, мой вопрос: есть ли разница?Во втором примере, инициирование dog создать уровень модуля globvar как и в первом примере, он будет вести себя так же и иметь ту же область действия?

Это было полезно?

Решение

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

def increment(n)
  # this creates a new local m
  m = n+1
  return m

Здесь новая локальная переменная m создается, даже если может существовать глобальная переменная m уже существующий.Это то, что вам обычно нужно, поскольку вызов некоторых функций не должен неожиданно изменять переменные в окружающих областях.Если вы действительно хотите изменить глобальную переменную, а не создавать новую локальную, вы можете использовать команду global ключевое слово:

def increment(n)
  global increment_calls
  increment_calls += 1
  return n+1

В твоем случае global в конструкторе не создает никаких переменных, дальнейшие попытки доступа globvar неудача:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "animals.py", line 7, in bark
    print globvar
NameError: global name 'globvar' is not defined

Но если бы вы действительно присвоили значение globvar в конструкторе при создании собаки будет создана глобальная переменная модуля:

class dog:
   def __init__(self):
      global globvar
      globvar = 1
...

Исполнение:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top