Споделяне на локална променлива между вложени функции в python

Как да накарам този код да работи?

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

f1()

Очакваният резултат, разбира се, е 0, 0, 1, 1, отпечатани ред по ред


person e271p314    schedule 13.11.2013    source източник
comment
Предполагам, че според вашите print изрази използвате Python 2. В Python 3 можете да използвате ключовата дума nonlocal, за да получите това, което искате. В Python 2 почти нямате късмет AFAIK.   -  person Wooble    schedule 13.11.2013
comment
Да, използвам python 2.7.3, но все пак трябва да реша подобна ситуация   -  person e271p314    schedule 13.11.2013
comment
Какъв е изходът ви от този код?   -  person leeladam    schedule 13.11.2013
comment
Защо не обмислите поставянето на цялата тази логика в клас? След това можете да имате g като член на класа, който да използвате навсякъде, където пожелаете.   -  person Inbar Rose    schedule 13.11.2013
comment
NameError: глобалното име 'g' не е дефинирано   -  person e271p314    schedule 13.11.2013


Отговори (2)


Ако не искате да използвате глобални:

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/

person Ioan Alexandru Cucu    schedule 13.11.2013

Какво за това :

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
person Vincent    schedule 13.11.2013
comment
Това е основно как работи сега, но тъй като работя в многонишково приложение, предпочитам да избягвам глобалните променливи. Защо Python не може да търси променливи в стека? - person e271p314; 13.11.2013