python - nonlocal - ¿Cómo cambio la variable de la función de anidamiento en la función anidada?
python nonlocal (3)
Me gustaría tener una variable definida en la función de anidación que se modificará en la función anidada, algo así como
def nesting():
count = 0
def nested():
count += 1
for i in range(10):
nested()
print count
Cuando se llama a la función de anidar, deseo que imprima 10, pero genera UnboundLocalError. La palabra clave global puede resolver esto. Pero como el recuento de variables solo se utiliza en el alcance de la función de anidamiento, espero no declararlo global. ¿Cuál es la buena manera de hacer esto?
El enfoque más elegante para mí: funciona al 100% en ambas versiones de python.
def ex8():
ex8.var = ''foo''
def inner():
ex8.var = ''bar''
print ''inside inner, ex8.var is '', ex8.var
inner()
print ''inside outer function, ex8.var is '', ex8.var
ex8()
inside inner, ex8.var is bar
inside outer function, ex8.var is bar
Más: http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/
En Python 3.x, puede usar la declaración nonlocal
(en nested
) para decirle a Python que quiere asignar a la variable de count
en el nesting
.
En Python 2.x, simplemente no puede asignar para count
en nesting
desde nested
. Sin embargo, puede solucionarlo al no asignarlo a la variable en sí, sino usar un contenedor mutable:
def nesting():
count = [0]
def nested():
count[0] += 1
for i in range(10):
nested()
print count[0]
Aunque para casos no triviales, el enfoque habitual de Python es envolver los datos y la funcionalidad en una clase, en lugar de usar cierres.
Un poco tarde, puede adjuntar un atributo a la función "anidar" de esta manera:
def nesting():
def nested():
nested.count += 1
nested.count = 0
for i in range(10):
nested()
return nested
c = nesting()
print(c.count)