[pyar] Bug o feature?

Matias Graña matias.alejo en gmail.com
Lun Feb 14 01:02:01 ART 2011


2011/2/14 Ale <peralta.alejandro en gmail.com>:
> El día 14 de febrero de 2011 00:22, Rafael Carrascosa
> <rafacarrascosa en gmail.com> escribió:
>> Hola gente, habiendo superado el test de la sonsera con 3 personas
>> consultadas ahora les pregunto a ustedes.
>>
>> Para este código: http://pastebin.lugmen.org.ar/6432
>> Yo esperaria de output "[1,2]", pero tengo "[1, 2, 1, 2, 1, 2, 1, 2,
>> 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]"
>> Estoy casi convencido que no puede ser un bug del interprete, pero...
>> ¿cual es la explicación "feature" de este comportamiento?
>
> No es un bug, es un comportamiento conocido, es por el x=[] en el
> __init__ de la clase.
>
> proba esto:
> In [20]: def blah(a=[]): a.append(1); return a
>   ....:
> In [21]: blah()
> Out[21]: [1]
> In [22]: blah()
> Out[22]: [1, 1]
> In [23]: blah()
> Out[23]: [1, 1, 1]
> In [24]: blah()
> Out[24]: [1, 1, 1, 1]
> In [25]: blah()
> Out[25]: [1, 1, 1, 1, 1]
> In [26]: blah()
> Out[26]: [1, 1, 1, 1, 1, 1]
> In [27]: blah()
> Out[27]: [1, 1, 1, 1, 1, 1, 1]
> In [28]: blah()
> Out[28]: [1, 1, 1, 1, 1, 1, 1, 1]
>
>
> En general se hace
>
> blah(a=None):
>  if not a:
>     a = []
>  etc..
>
> El tema está en que el objeto, la lista vacia, se crea una sola vez en
> el momento de la definición de la clase.
>
> http://stackoverflow.com/questions/4535667/python-list-should-be-empty-on-class-instance-initialisation-but-its-not-why
>
>
>>
>> Saludos!
>>
>> PD: python version 2.6.5 en un ubuntu 10.04 vainilla
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>
>
>
> --
> Ale.

Hasta donde sé, cuando se crea la función los parámetros default van
en una tupla (o como se le llame en español). La tupla se recupera con
func_defaults. Como es una tupla, es inmodificable, y como una lista
es modificable, se observa ese comportamiento.

>>> def f(a=[], b=0):
	a.append(1)
	b += 1

>>> f.func_defaults
([], 0)
>>> f()
>>> f.func_defaults
([1], 0)


Saludos,
Matías



More information about the pyar mailing list