Estaba jugando en python. Usé el siguiente código en IDLE:
p = [1, 2]
p[1:1] = [p]
print p
El resultado fue:
[1, [...], 2]
¿Qué es esto […]
? Curiosamente, ahora podría usar esto como una lista de lista de lista hasta el infinito, es decir
p[1][1][1]....
Podría escribir lo anterior todo el tiempo que quisiera y aún funcionaría.
EDITAR:
- ¿Cómo se representa en la memoria?
- ¿De qué sirve? Ejemplos de algunos casos donde es útil sería útil.
- Cualquier enlace a la documentación oficial sería realmente útil.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
fuente
fuente
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. ¿Qué corriste?Respuestas:
Significa que creó una lista infinita anidada dentro de sí misma, que no se puede imprimir.
p
contienep
que contienep
... y así sucesivamente. ¡La[...]
notación es una manera de hacerle saber esto y de informarle que no se puede representar! Eche un vistazo a la respuesta de @ 6502 para ver una bonita imagen que muestra lo que está sucediendo.Ahora, con respecto a los tres nuevos elementos después de su edición:
fuente
Esto es lo que creó tu código
Es una lista donde el primer y el último elemento apuntan a dos números (1 y 2) y el elemento central apunta a la lista misma.
En Common Lisp, cuando la impresión de estructuras circulares está habilitada, dicho objeto se imprimiría como
lo que significa que hay un objeto (etiquetado con 1
#1=
) que es un vector con tres elementos, el segundo es el objeto mismo (referenciado con#1#
).En Python, solo obtienes la información con la que la estructura es circular
[...]
.En este caso específico, la descripción no es ambigua (apunta hacia atrás a una lista, pero solo hay una lista, por lo que debe ser esa). En otros casos puede ser sin embargo ambiguo ... por ejemplo en
la referencia hacia atrás podría apuntar a la lista externa o interna. Estas dos estructuras diferentes impresas de la misma manera se pueden crear con
y estarían en la memoria como
fuente
[1, [2, [...], 3]]
esta manera:x[1] = [2, [...], 3]
yy[1] = [2, 1, [...]], 3]
. Esto significa que x consiste en un 1 y luego repite 2s, mientras que y consiste en alternar 1s y 2s.#(1 #1=#(2 #1# 3))
parax
y#1=#(1 #(2 #1# 3))
paray
.#1=(1 . #1#)
.A la pregunta "¿De qué sirve?", Aquí hay un ejemplo concreto.
La reducción de gráficos es una estrategia de evaluación que se usa alguna vez para interpretar un lenguaje de computadora. Esta es una estrategia común para la evaluación diferida, especialmente de lenguajes funcionales.
El punto de partida es construir un gráfico que represente la secuencia de "pasos" que tomará el programa. Dependiendo de las estructuras de control utilizadas en ese programa, esto podría conducir a un gráfico cíclico (porque el programa contiene algún tipo de bucle "para siempre", o utilizar la recursión cuya "profundidad" se conocerá en el momento de la evaluación , pero no en el gráfico). tiempo de creación ) ...
Para representar dicho gráfico, necesita infinitas "estructuras de datos" (a veces llamadas estructuras de datos recursivas ), como la que notó. Por lo general, un poco más complejo sin embargo.
Si está interesado en ese tema, aquí hay (entre muchos otros) una conferencia sobre ese tema:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
fuente
Hacemos esto todo el tiempo en la programación orientada a objetos. Si dos objetos se refieren entre sí, directa o indirectamente, ambos son estructuras infinitamente recursivas (o ambas partes de la misma estructura infinitamente recursiva, dependiendo de cómo se mire). Es por eso que no ves tanto en algo tan primitivo como una lista, porque generalmente es mejor describir el concepto como "objetos" interconectados que una "lista infinita".
También puede obtener
...
con un diccionario infinitamente recursivo. Digamos que desea un diccionario de las esquinas de un triángulo, donde cada valor es un diccionario de las otras esquinas conectadas a esa esquina. Podrías configurarlo así:Ahora, si imprime
triangle
(oa
ob
oc
para el caso), verá que está lleno{...}
porque cualquiera de las dos esquinas se refieren entre sí.fuente
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
para desactivar la impresión bonita, se mostrará...
.Como entendí, este es un ejemplo de punto fijo
fuente
p = [1]; p[0] = p
ejemplo más simple que debef = lambda x:x[0]
funcionar. Es un ejemplo de un punto fijo, pero aún no he podido ver cómo saber esto es útil. El valor real del punto fijo llega a él desde algún otro punto de manera recursiva o iterativa. Un ejemplo que muestre cómo usar la estructura de lista de la pregunta original para crear el combinador Y sería útil si fuera posible.q = lambda: q
hace una lambda infinitamente invocableEl nombre de ese objeto especial es Elipsis. Supongo que se implementa como un objeto singleton en el Python intepreter / VM, algo así como None, una especie de centinela. Como has visto, es una forma en que Python representa la referencia de una lista dentro de sí mismo.
fuente