Путаница с глобальными переменными в Python - PullRequest
6 голосов
/ 30 марта 2012

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

Когда я делаю это, у меня возникают следующие проблемы ...

  1. Программа думает, что myGlobalне был определен в основном.Но это так.Зачем?
  2. Когда я вызываю подпрограмму после того, как я изменил myGlobal.Я не хотел, чтобы это произошло.

Как правильно выполнить то, что я пытаюсь сделать здесь?Примеры?

#!/usr/bin/python

import sys

myGlobal = "foo"

print "********************"
print "MyGlobal %s" % myGlobal
print "********************"


def main(argv):

   #UnboundLocalError: local variable 'myGlobal' referenced before assignment
   print '1. Printing the global again: ' + myGlobal

   myGlobal = "bar"
   print "2. Change the global and print again: " + myGlobal

   # now call a subroutine
   mySub()

# Checks for output file, if it doesn't exist creates one
def mySub():
   # Why isn't the global "bar" not "foo"?
   print '3. Printing the global again: ' + myGlobal

   myGlobal = "black sheep"
   print "4. Change the global and print again: " + myGlobal




if __name__ == "__main__":
   main(sys.argv[1:])

Ответы [ 2 ]

9 голосов
/ 30 марта 2012

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

def main(argv):
  global myGlobal
  #...
  myGlobal = "bar"

В противном случае назначение будетпросто создайте новую локальную переменную, которая затеняет вашу глобальную переменную (чтобы изменения в ней не повлияли на глобальную переменную, как в вашем примере).

Тем не менее, вы также можете использовать здесь класс дляпусть ваши функции делятся состоянием лучше:

class MyApp(object):
  def main(self, argv):
    self.myVar = "bar"
    self.mySub()

  def mySub(self):
    print self.myVar

MyApp().main(sys.argv[1:])
2 голосов
/ 30 марта 2012

То, что вы ищете, это глобальное выражение в python.Вставьте global myGlobal перед вашими кодовыми блоками в main и mySub, и вы получите предсказуемое поведение.Сказав это, если вам нужно передать информацию о состоянии между функциями, используйте аргументы для функции.Это намного аккуратнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...