def say_boo_twice():
global boo
boo = 'Boo!'
print boo, boo
boo = 'boo boo'
say_boo_twice()
Выходной сигнал
Boo! Boo!
Не так, как я ожидал. Поскольку я объявлял boo
глобальным, почему не вывод:
boo boo boo boo
def say_boo_twice():
global boo
boo = 'Boo!'
print boo, boo
boo = 'boo boo'
say_boo_twice()
Выходной сигнал
Boo! Boo!
Не так, как я ожидал. Поскольку я объявлял boo
глобальным, почему не вывод:
boo boo boo boo
Вы изменили boo
внутри своей функции, почему бы не изменить ее? Кроме того, глобальные переменные являются плохими.
Потому что вы переназначаете прямо перед рукой. Прокомментируйте boo = 'Boo!'
, и вы получите то, что вы описали.
def say_boo_twice():
global boo
#boo = 'Boo!'
print boo, boo
boo = 'boo boo'
say_boo_twice()
Также, что global boo
не требуется, boo
уже находится в глобальной области.
Здесь global
имеет значение
def say_boo_twice():
global boo
boo = 'Boo!'
print boo, boo
say_boo_twice()
print "outside the function: " + boo #works
В то время как:
def say_boo_twice():
#global boo
boo = 'Boo!'
print boo, boo
say_boo_twice()
print "outside the function: " + boo # ERROR. boo is only known inside function, not to this scope
Вы повторно назначаете boo после объявления его как глобального, поэтому значение является последним, которое вы ему назначили. Если вы удалите третью строку, вы получите ожидаемый результат.
По сути, вы переназначаете boo при вызове функции.
Проверьте, как это работает с функциями globals() и locals().
Прежде чем привести пример, я хочу, чтобы вы поняли разницу между глобальной и локальной переменной в python
глобальная переменная: Это относится к текущему модулю
локальная переменная: Это относится к текущим функциям или методам, как мы их называем в python
Что делать, если как локальная, так и текущая переменные имеют одно и то же имя?
В таком случае, если вы не определяете вашу переменную boo как глобальную в том же методе или функции, она по умолчанию будет использовать ее как локальная переменная
Переход к вашему коду
Вы определили boo как global в своем методе say_boo_twice(). Уловка, когда вы пытаетесь инициализировать boo = 'Boo!' в этом методе, вы фактически перезаписываете то, что вы инициализировали ранее как boo = 'boo boo'
Попробуйте этот код
- Я не инициализировал переменную boo внутри метода say_boo_twice()
def say_boo_twice():
global boo
print boo, boo
boo = 'boo boo'
say_boo_twice()
Все лучшее!!!!!
global boo является глобальным только внутри метода say_boo_twice и был повторно назначен значение внутри этого метода. Вам нужно понять лексику или сферу действия, где она может быть глобальной или то, что вы хотите. В этом контексте, перед печатью, ему было присвоено значение "Boo!" и это то, что он правильно напечатал.