2013-09-13 3 views
0

Я думал, что могу обновить переменную, указанную в верхней части скрипта Python, внутри функции, но это неверно. Мне удается сделать это с помощью global:Как обрабатывать переменную область элегантно в Python?

count = 0 

def updateCount(): 
    global count 
    print count 
    count = (count+1)%10 

for x in xrange(10): 
    updateCount() 

Это лучший способ справиться с этим (функция обновления переменной на более высоком уровне)? Что такое «питонический» способ борьбы с этим. глобальный кажется немного свободным.

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

+2

Используйте возвращаемое значение функций: например, 'count = updateCount (count)'. Для состояния, которое должно быть сохранено (и, возможно, мутировано), рассмотрите объекты для хранения таких данных. – user2246674

+3

Просто не используйте глобальную переменную. Язык преднамеренно разработан, чтобы вам было трудно переназначить имена в глобальном пространстве имен в функции, поэтому зачем бороться с ним? Либо переопределите глобальную переменную явно в глобальной области, написав «updateCount», чтобы иметь параметр и присваивание 'count = updateCount (count)', или использовать изменяемый объект с методами для изменения своего собственного состояния (приращение атрибута 'count' в твоем случае). –

+0

Самый пифонический путь - это не использование глобальных переменных. – Hyperboreus

ответ

1

Существует множество решений, в зависимости от того, чего вы хотите достичь.

Некоторые уже упоминалось в комментариях к вашему вопросу:

  • Создать класс. updateCount представляет собой метод, count является атрибутом
  • Возвращаемое значение из updateCount вместо использования глобального count

Также вы можете использовать

  • Closures
  • Генераторы

ИМХО, самый «питонический» (читай «крутой») способ мог бы использовать генераторы, с примером

def updateCount(x): 
    count = 0 
    for i in xrange(x): 
     count = (count+1) % 10 
     yield count 

for i in updateCount(15): 
    print i 
+0

, это довольно круто. Я собираюсь использовать предложение возвращаемого значения user2246674 для сейчас и позже рефакторинга и использовать класс –

Смежные вопросы