web-dev-qa-db-fra.com

Que signifie Ellipsis [...] dans une liste?

Je jouais en python. J'ai utilisé le code suivant dans IDLE:

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

Le résultat était:

[1, [...], 2]

Qu'est-ce que c'est […]? Fait intéressant, je pourrais maintenant l'utiliser comme une liste de liste de liste jusqu'à l'infini, c'est-à-dire.

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

Je pourrais écrire ce qui précède aussi longtemps que je le souhaite et cela fonctionnerait toujours.

MODIFIER:

  • Comment est-il représenté en mémoire?
  • Quel est son utilisation? Des exemples de certains cas où il est utile seraient utiles.
  • Tout lien vers la documentation officielle serait vraiment utile.
187
Aseem Bansal

Cela signifie que vous avez créé une liste infinie imbriquée en elle-même, qui ne peut pas être imprimée. p contient p qui contient p ... et ainsi de suite. Le [...] la notation est un moyen de vous le faire savoir et d'informer qu'elle ne peut pas être représentée! Jetez un œil à la réponse de @ 6502 pour voir une belle photo montrant ce qui se passe.

Maintenant, concernant les trois nouveaux éléments après votre modification:

  • Cela réponse semble le couvrir
  • Ignacio's link décrit quelques utilisations possibles
  • Il s'agit plus d'un sujet de conception de structure de données que de langages de programmation, il est donc peu probable qu'une référence soit trouvée dans la documentation officielle de Python
105
Óscar López

C'est ce que votre code a créé

enter image description here

C'est une liste où le premier et le dernier éléments pointent vers deux nombres (1 et 2) et où l'élément du milieu pointe vers la liste elle-même.

Dans LISP commun lorsque l'impression de structures circulaires est activée, un tel objet sera imprimé comme

#1=#(1 #1# 2)

ce qui signifie qu'il y a un objet (étiqueté 1 avec #1=) qui est un vecteur à trois éléments, le second étant l'objet lui-même (référencé en arrière avec #1#).

Dans Python à la place, vous obtenez simplement l'information que la structure est circulaire avec [...].

Dans ce cas précis, la description n'est pas ambiguë (elle pointe vers une liste en arrière mais il n'y a qu'une seule liste donc elle doit être celle-là). Dans d'autres cas, cela peut être ambigu ... par exemple dans

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

la référence arrière peut pointer soit vers la liste externe soit vers la liste interne. Ces deux structures différentes imprimées de la même manière peuvent être créées avec

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

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

print(x)
print(y)

et ils seraient en mémoire comme

enter image description here

309
6502

A la question "Quelle est son utilisation", voici un exemple concret.

réduction graphique est une stratégie d'évaluation parfois utilisée pour interpréter un langage informatique. Il s'agit d'une stratégie courante pour l'évaluation paresseuse, notamment des langages fonctionnels.

Le point de départ est de construire un graphique représentant la séquence des "étapes" du programme. Selon les structures de contrôle utilisées dans ce programme, cela peut conduire à un graphique cyclique (car le programme contient une sorte de boucle "pour toujours" - ou utiliser une récursion dont la "profondeur" sera connue au moment de l'évaluation , mais pas au moment de la création du graphe heure) ...

Pour représenter un tel graphique, vous avez besoin d'infinies "structures de données" (parfois appelées récursives structures de données), comme celle que vous avez remarquée. Habituellement, un peu plus complexe cependant.

Si vous êtes intéressé par ce sujet, voici (parmi tant d'autres) une conférence sur ce sujet:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

21
Sylvain Leroux

Nous le faisons tout le temps en programmation orientée objet. Si deux objets se réfèrent l'un à l'autre, directement ou indirectement, ils sont tous les deux des structures infiniment récursives (ou les deux font partie de la même structure infiniment récursive, selon la façon dont vous le regardez). C'est pourquoi vous ne voyez pas cela autant dans quelque chose d'aussi primitif qu'une liste - car il vaut généralement mieux décrire le concept comme des "objets" interconnectés que comme une "liste infinie".

Vous pouvez également obtenir ... avec un dictionnaire infiniment récursif. Disons que vous voulez un dictionnaire des coins d'un triangle, où chaque valeur est un dictionnaire des autres coins connectés à ce coin. Vous pouvez le configurer comme ceci:

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

Maintenant, si vous imprimez triangle (ou a ou b ou c d'ailleurs), vous verrez qu'il est plein de {...} parce que deux coins se réfèrent l'un à l'autre.

7
nmclean

Si je comprends bien, ceci est un exemple de point fixe

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