Глобальные переменные модуля Python и глобальные переменные __init__
Вопрос
Извиняюсь, несколько запутанный вопрос для новичков в 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__
не имеет значения - это так нет создайте глобальный, потому что он ничего ему не назначает.