variable nonlocal modify functions python global-variables nested-function

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)