2013-11-13 1 views
1

Как мне заставить этот код работать?Совместное использование локальной переменной между вложенными функциями в python

def f1(): 
    def f2(): 
     print g 
     g = 1 
     print g 
    g = 0 
    print g 
    f2() 
    print g 

f1() 

ожидаемый результат, конечно, 0, 0, 1, 1, напечатанная строка за строкой

+0

Я предполагаю, что ваши 'print' заявления, которые вы используете Python 2. В Python 3, вы можете использовать ключевое слово 'nonlocal', чтобы получить то, что хотите. В Python 2 вы в значительной степени не повезло AFAIK. – geoffspear

+0

Да, я использую python 2.7.3, но все равно нужно решить аналогичную ситуацию – e271p314

+0

Каков ваш выход из этого кода? – leeladam

ответ

2

If вы не хотите использовать глобальные переменные:

def f1(): 
    def f2(): 
     print g[0] 
     g[0] = 1 
     print g[0] 
    g =[0] 
    print g[0] 
    f2() 
    print g[0] 

    f1() 

Это связано с тем, что вы не можете переназначить переменную, принадлежащую внешней области. Когда вы переназначаете его, вы в основном создаете новую переменную внутри вложенной функции. Чтобы обойти это, вы переносите свое значение в список и переназначаете элемент списка.

Это проблема в Python 2. Python 3 исправляет это через использование нелокального заявления:

http://technotroph.wordpress.com/2012/10/01/python-closures-and-the-python-2-7-nonlocal-solution/

0

Что об этом:

def f1(): 
    def f2(): 
     global g 
     print g 
     g = 1 
     print g 
    global g 
    g = 0 
    print g 
    f2() 
    print g 

f1() 

Выход:

0 
0 
1 
1 
+0

Это в основном то, как это работает сейчас, но поскольку я работаю в многопоточном приложении, я предпочитаю избегать глобальных переменных. Почему python не может найти стек для переменных? – e271p314