Variables que funcionen como punteros?

Arnau Sanchez arnau en ehas.org
Mar Mar 13 15:42:48 CET 2007


Chema Cortes escribió:

> El 13/03/07, Oswaldo Hernández <listas en soft-com.es> escribió:
>> Manuel Malo de Molina escribió:
>> > Y para que solo sea de parte de la lista? porque si hago esto no 
>> funciona:
>> >
>> >>>> lista1 = [1,2,3,4,5,6]
>> >>>> lista2 = A[3:len(A)]
>> >>>> lista1[4] = 'cuatro'
>> >>>> lista2
>> > [4, 5, 6]
>> >
>>
>> Al hacer lista2 = lista1[3:len(A)] estas haciendo una copia 
>> independiente por lo que pierdes las
>> referencias a la lista original.
>>
>> Me da la impresion que lo que quieres es una referencia a una porcion 
>> de la lista, lo que en C seria:
>>         Int lista1[5] = ....
>>         Int *lista2;
>>         lista2 = &lista1[3]
>>
>> Creo que las listas no lo permiten. Desconozco si alguna de las 
>> librerias numericas o de manejo de
>> arrays lo contemplan.
> 
> Sería una locura. Por ejemplo, ¿qué significaría ésto?:
> 
> del lista1[3]
> 
> a) que se borra el elemento 3 de lista1, y que el 4 pasa a ser el
> primero de lista2
> b) que se borra el elemento 3 de lista1 y el elemento correspondiente
> de todas las listas que enlanza con lista1 y que tuvieran ese
> elemento.
> 
> Si encima entramos en las listas anidadas (listas recursivas), todavía
> sería peor su interpretación.

Primero, decir que Chema tiene razón, si las listas permitieran lo que pides, su 
comportamiento sería imprevisible. Por otro lado, si no tienes inconveniente en 
usar arrays, con ese tipo de objetos sí se puede hacer:

 > import numpy
 > a = numpy.array([0,1,2,3])
 > b = a[1:]
 > a[1] = 10
 > a
array([ 0, 10,  2,  3])
 > b
array([10,  2,  3])

Pero claro, un array no es una lista.

Por último, en mi opinión, en un lenguaje interpretado deberías hacerlo de otra 
forma: mantén sólo un objeto (en este caso, la lista) y de ahí sacas la 
información que necesites mediante funciones o métodos (si es que esa lista 
forma parte de una clase).

Ejemplo simple, para acceder a elementos individuales de la "lista a[3:5]", 
podrías hacer:

 >a=[0,1,2,3,4,5,6,7]
 >b = lambda i: a[3:5][i]
 >b(0)
3
 >a[3] = "tres"
 >b(0)
"tres"

De nuevo, no es una lista de verdad, pero puede servir.

arnau




Más información sobre la lista de distribución Python-es