El 9 de abril de 2014, 17:47, Rock Neurotiko
<[email protected]>escribió:

> Claro, ese es el comportamiento que se espera si conoces cómo funciona
> Python al asignar los valores.
>
> En otros lenguajes, el valor por defecto siempre se evalua (en python solo
> la primera vez que llamas a ese metodo), por lo que si no le pasas el
> parametro siempre va a ser el que viene por defecto, por mucho que sea
> mutable el tipo, ya que evaluan el valor por defecto.
>

Para ser estrictos, los valores por defecto se evalúan al definir la
función, no en la primera llamada. Mejor dicho: los argumentos por defecto
se evalúan en el "entorno" donde se define la función (véase clausura o
ámbito léxico)

La recomendación en python proteger estos valores mutables usando None y
luego dar un valor por defecto dentro del ámbito privado de la función:

def foo(n, v=None):
  if v is None:
    v = []

Así sí que se asegura que el valor inicial de la lista vacía no será
alterado desde fuera de la función.




> Pero, como digo, en Python no es así, y para la gente que no lo sepa (como
> yo al iniciar el hilo) les puede traer problemas.
>
>
>
> El 9 de abril de 2014, 17:39, Arturo Llaja Alarcón <
> [email protected]> escribió:
>
>>  On 09/04/14 09:38, Rock Neurotiko wrote:
>>
>> x = []
>>
>> Pero se lo estás pasando en la línea:
>> def foo(x = []):
>>
>> Según lo que leo, la función crea una variable x, y le asigna un valor
>> x.append(1), en ningún momento la destruye ni la reinicia.
>>
>> La variable x se queda en memoria y por lo tanto al llamar de nuevo la
>> función foo() se agrega un valor a la lista, recuerda que las listas son
>> mutables.
>>
>> Para que siempre tengas un mismo valor mejor sería usar una tupla:
>>
>> def foo(x=()):
>>     x = (1)
>>     print(x)
>>
>>
>> foo()
>> 1
>>
>> foo()
>> 1
>>
>> tal como se describe en la resolución de variables locales y globales de
>> Python.
>> Es mi observación, salvo mejor opinión,
>>
>> _______________________________________________
>> Python-es mailing list
>> [email protected]
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
>
> --
> Miguel García Lafuente - Rock Neurotiko
>
> Do it, the devil is in the details.
> The quieter you are, the more you are able to hear.
> Happy Coding. Code with Passion, Decode with Patience.
> If we make consistent effort, based on proper education, we can change the
> world.
>
> El contenido de este e-mail es privado, no se permite la revelacion del
> contenido de este e-mail a gente ajena a él.
>
> _______________________________________________
> Python-es mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
_______________________________________________
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a