¿Cómo cambio la variable de la función de anidamiento en la función anidada?

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 scope de la función de anidamiento, espero no declararlo global. ¿Cuál es la buena manera de hacer esto?

En Python 3.x, puede usar la statement 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) 

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/