Глобальная переменная Python - PullRequest
12 голосов
/ 04 апреля 2011
def say_boo_twice():
  global boo
  boo = 'Boo!'
  print boo, boo

boo = 'boo boo'
say_boo_twice()

Выход

Boo! Boo!

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

Бу Бу Бу Бу

Ответы [ 6 ]

24 голосов
/ 04 апреля 2011

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

17 голосов
/ 04 апреля 2011

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

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

3 голосов
/ 04 апреля 2011

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

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

0 голосов
/ 26 сентября 2017

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

0 голосов
/ 23 января 2015

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

глобальная переменная: Это относится к текущему модулю

локальная переменная: Это характерно для текущих функций или методов, как мы их называем в python

Что, если локальная и текущая переменные имеют одинаковое имя boo?

В таком случае, если вы не определили переменную boo как глобальную в том же методе или функции, она по умолчанию будет использовать ее как локальную переменную

Подходит к вашему коду

Вы определили boo как глобальный в вашем методе 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()

Всего наилучшего !!! !! !

...