Подтвердить что ты не робот

Глобальная переменная Python

def say_boo_twice():
  global boo
  boo = 'Boo!'
  print boo, boo

boo = 'boo boo'
say_boo_twice()

Выходной сигнал

Boo! Boo!

Не так, как я ожидал. Поскольку я объявлял boo глобальным, почему не вывод:

boo boo boo boo

4b9b3361

Ответ 1

Вы изменили boo внутри своей функции, почему бы не изменить ее? Кроме того, глобальные переменные являются плохими.

Ответ 2

Потому что вы переназначаете прямо перед рукой. Прокомментируйте 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

Ответ 3

Вы повторно назначаете boo после объявления его как глобального, поэтому значение является последним, которое вы ему назначили. Если вы удалите третью строку, вы получите ожидаемый результат.

Ответ 4

По сути, вы переназначаете boo при вызове функции.

Проверьте, как это работает с функциями globals() и locals().

Ответ 5

Прежде чем привести пример, я хочу, чтобы вы поняли разницу между глобальной и локальной переменной в 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()

Все лучшее!!!!!

Ответ 6

global boo является глобальным только внутри метода say_boo_twice и был повторно назначен значение внутри этого метода. Вам нужно понять лексику или сферу действия, где она может быть глобальной или то, что вы хотите. В этом контексте, перед печатью, ему было присвоено значение "Boo!" и это то, что он правильно напечатал.