[pyar] lista.insert()

1 view
Skip to first unread message

Juan Pablo Rabino

unread,
Feb 7, 2011, 2:29:23 PM2/7/11
to py...@python.org.ar
Hoy cai en un "problema" con listas usando Python 2.6

Basicamente, teniendo una lista, realizo una copia de ésta y le inserto un elemento, el elemento se inserta en ambas. Ejemplifico:

>>> lista=[1,2,3,4,5,6,7]
>>> lista
[1, 2, 3, 4, 5, 6, 7]
>>> lista2=lista
>>> lista2
[1, 2, 3, 4, 5, 6, 7]
>>> lista2.insert(2,"ELEMENTO INSERTADO")
>>> lista2
[1, 2, 'ELEMENTO INSERTADO', 3, 4, 5, 6, 7]
>>> lista
[1, 2, 'ELEMENTO INSERTADO', 3, 4, 5, 6, 7]

¿Alguien me podría explicar por qué pasa esto?

Obviamente, conocido el problema, el workaround es trivial, pero queria saber si alguien me podia explicar la razon.
Es como que python no realiza una copia, sino que simplemente asigna el mismo puntero de memoria a ambas listas. Si alguien tiene la respuesta se agradece.

Sebastian Bassi

unread,
Feb 7, 2011, 2:34:02 PM2/7/11
to Python Argentina
2011/2/7 Juan Pablo Rabino <jpra...@gmail.com>

¿Alguien me podría explicar por qué pasa esto?
Obviamente, conocido el problema, el workaround es trivial, pero queria saber si alguien me podia explicar la razon.
Es como que python no realiza una copia, sino que simplemente asigna el mismo puntero de memoria a ambas listas. Si alguien tiene la respuesta se agradece.

Vos mismo lo decis, son 2 nombres distinto para el mismo objeto en memoria. Pasa porque fue diseñado asi. El igual de asinacion de nombres, no es para copiar.

Patricio Molina

unread,
Feb 7, 2011, 2:34:13 PM2/7/11
to Python Argentina
2011/2/7 Juan Pablo Rabino <jpra...@gmail.com>
>
> _______________________________________________
> pyar mailing list py...@python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

No es una copia, lista2 está apuntando a la misma dirección de memoria
que lista. Fijate haciendo id(lista) e id(lista2)

Una copia sería lista2 = lista[:]

Saludos
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

QliX=D! [aka EHB]

unread,
Feb 7, 2011, 2:57:23 PM2/7/11
to Python Argentina
Usa lista2(lista) o lista2=list().extend(lista) por que la asignacion es un alias al mismo objeto.

EHB

2011/2/7 Juan Pablo Rabino <jpra...@gmail.com>
Hoy cai en un "problema" con listas usando Python 2.6

Juan BC

unread,
Feb 7, 2011, 3:35:18 PM2/7/11
to Python Argentina
La forma mas popular es esta

lista2 = list(lista1)

"QliX=D! [aka EHB]" <qli...@gmail.com> escribió:

>Usa lista2(lista) o lista2=list().extend(lista) por que la asignacion es un
>alias al mismo objeto.
>
>EHB
>
>2011/2/7 Juan Pablo Rabino <jpra...@gmail.com>
>
>> Hoy cai en un "problema" con listas usando Python 2.6
>>
>> Basicamente, teniendo una lista, realizo una copia de ésta y le inserto un
>> elemento, el elemento se inserta en ambas. Ejemplifico:
>>
>> >>> lista=[1,2,3,4,5,6,7]
>> >>> lista
>> [1, 2, 3, 4, 5, 6, 7]
>> >>> lista2=lista
>> >>> lista2
>> [1, 2, 3, 4, 5, 6, 7]
>> >>> lista2.insert(2,"ELEMENTO INSERTADO")
>> >>> lista2
>> [1, 2, 'ELEMENTO INSERTADO', 3, 4, 5, 6, 7]
>> >>> lista
>> [1, 2, 'ELEMENTO INSERTADO', 3, 4, 5, 6, 7]
>>
>> ¿Alguien me podría explicar por qué pasa esto?
>>
>> Obviamente, conocido el problema, el workaround es trivial, pero queria
>> saber si alguien me podia explicar la razon.
>> Es como que python no realiza una copia, sino que simplemente asigna el
>> mismo puntero de memoria a ambas listas. Si alguien tiene la respuesta se
>> agradece.
>>
>>

Tordek

unread,
Feb 7, 2011, 10:04:21 PM2/7/11
to Python Argentina
On 07/02/11 17:35, Juan BC wrote:
> La forma mas popular es esta
>
> lista2 = list(lista1)
>

lista2 = lista1[:]

--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek
http://www.arcanopedia.com.ar - Juegos de Rol en Argentina

Mauro Caceres

unread,
Feb 8, 2011, 1:28:32 PM2/8/11
to Python Argentina
Hoy cai en un "problema" con listas usando Python 2.6

Basicamente, teniendo una lista, realizo una copia de ésta y le inserto un elemento, el elemento se inserta en ambas. 

Mauro Cáceres
Reply all
Reply to author
Forward
0 new messages