[pyar] Cuando el futuro afecta el presente

Claudio Freire klaussfreire en gmail.com
Vie Oct 23 22:48:15 ART 2015


2015-10-23 22:23 GMT-03:00 Sebastian Bassi <sebastian.bassi en globant.com>:
>
> test_foo se ejecuta sin problemas (porque al no encontrar foo en el ambito
> de la función, lo busca en el ambito anterior y lo encuentra).
> new_test_foo, me dá un error inesperado (para mi):
> Traceback (most recent call last):
>   File "/home/sbassi/foo.py", line 15, in <module>
>     new_test_foo()
>   File "/home/sbassi/foo.py", line 10, in new_test_foo
>     print foo
> UnboundLocalError: local variable 'foo' referenced before assignment
>
> Lo que me parece "raro" es que el programa falla en la linea "print foo" de
> new_test_foo, pero debido a lo que va a ocurrir en la siguiente linea, ya
> que el print foo de la funcion test_foo no falla.


Es por cómo se define el scope de una variable en Python.

Las variables locales se definen como los nombres que son asignados en
el scope local (función actual).

O sea, si no hay un:

nombre = blah

nombre es global. Pero si lo hay, nombre es local. Para cambiar ese
comportamiento podés usar declaraciones de scope explícitas:

global nombre
nonlocal nombre # en py3, no es lo mismo que global, diferencia sutil

Cuando una variable es local, hasta que es asignada, está indefinida.
Luego de ser des-asignada, también:

def f():
  x = 3
  del x
  print x

Esto es así incluso si hay una global x. No importa. La asignación,
esté donde esté, convierte al nombre "x" en una referencia a una
variable local en toda la función.

Nonlocal se puede usar para acceder a variables en un scope externo a
la función que no es el global:

def f():
  x = 0
  def g(y):
     nonlocal x
     x += y
     return x
  return g

En este caso, global no sería lo mismo.


More information about the pyar mailing list