write variable reading raw_input print org open imprimir files examples and python python-2.7 python-3.x list ellipsis

variable - range python 3



¿Cuáles son las elipsis[...] en una lista de Python? (6)

Estaba jugando en Python. Usé el siguiente código en IDLE

p = [1, 2] p[1:1] = [p] print p

La salida fue

[1, [...], 2]

Que es esto […]? Curiosamente, ahora podría usar esto como una lista de la lista de la lista hasta el infinito, es decir,

p[1][1][1]....

Podría escribir lo anterior todo el tiempo que quisiera y aún así funcionaría.

EDITAR:

  • ¿Cómo se representa en la memoria?
  • ¿De qué sirve? Ejemplos de algunos casos en los que es útil serían útiles.
  • Cualquier enlace a la documentación oficial sería realmente útil.

A la pregunta "¿De qué sirve?", Aquí hay un ejemplo concreto.

La reducción de gráficos es una estrategia de evaluación que alguna vez se usa para interpretar un lenguaje de computadora. Esta es una estrategia común para la evaluación perezosa, especialmente de los 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 ciclo "para siempre" o usar recursividad 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


Como entendí, este es un ejemplo de punto fijo

p = [1, 2] p[1:1] = [p] f = lambda x:x[1] f(p)==p f(f(p))==p


El nombre de ese objeto especial es el Ellipsis. Supongo que está implementado como un objeto singleton en el intérprete / VM de Python, algo así como None, un tipo de centinela. Como has visto, es una forma de que Python represente la referencia de una lista dentro de sí misma.


Esto es lo que creó tu código

Es una lista donde los elementos primero y último apuntan a dos números (1 y 2) y donde el elemento medio apunta a la lista misma.

En Common Lisp cuando se habilita la impresión de estructuras circulares, dicho objeto se imprimiría como

#1=#(1 #1# 2)

lo que significa que hay un objeto (etiquetado 1 con #1= ) que es un vector con tres elementos, el segundo es el objeto en sí (referencia atrás con #1# ).

En Python, en cambio, obtienes la información de que la estructura es circular con [...] .

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 ambiguo ... por ejemplo en

[1, [2, [...], 3]]

la referencia hacia atrás podría ya sea a la lista externa o a la lista interna. Estas dos estructuras diferentes impresas de la misma manera se pueden crear con

x = [1, [2, 3]] x[1][1:1] = [x[1]] y = [1, [2, 3]] y[1][1:1] = [y] print x, y

y estarían en la memoria como


Hacemos esto todo el tiempo en la programación orientada a objetos. Si dos objetos se refieren el uno al otro, 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 se ve tanto en algo tan primitivo como una lista, porque normalmente es mejor describir el concepto como "objetos" interconectados que como una "lista infinita".

También puede obtener ... con un diccionario infinitamente recursivo. Digamos que quieres 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í:

a = {} b = {} c = {} triangle = {"a": a, "b": b, "c": c} a["b"] = b a["c"] = c b["a"] = a b["c"] = c c["a"] = a c["b"] = b

Ahora bien, si imprime un triangle (o a b c ), verá que está lleno de {...} porque dos esquinas se refieren una a la otra.


Significa que ha creado una lista infinita anidada dentro de sí misma, que no se puede imprimir. p contiene p que contiene p ... y así sucesivamente. La [...] notación es una manera de hacerte saber esto y de informar que no se puede representar. Eche un vistazo a la respuesta de @ 6502 para ver una buena imagen que muestra lo que está sucediendo.

Ahora, con respecto a los tres nuevos elementos después de su edición:

  • Esta answer parece cubrirlo
  • El link de Ignacio describe algunos usos posibles
  • Este es más un tema de diseño de estructura de datos que los lenguajes de programación, por lo que es poco probable que se encuentre alguna referencia en la documentación oficial de Python.