Was ist die Ellipse [...] in einer Python-Liste?


Answers

Das bedeutet, dass Sie eine in sich verschachtelte unendliche Liste erstellt haben, die nicht gedruckt werden kann. p enthält p das p enthält ... und so weiter. Die Notation ist eine Möglichkeit, Sie darüber zu informieren und darüber zu informieren, dass sie nicht dargestellt werden kann. Werfen Sie einen Blick auf die Antwort von @ 6502, um ein schönes Bild zu sehen, das zeigt, was passiert.

Nun zu den drei neuen Elementen nach deiner Bearbeitung:

  • Diese answer scheint es zu erfassen
  • Ignacios link beschreibt einige mögliche Anwendungen
  • Dies ist eher ein Thema des Datenstrukturdesigns als Programmiersprachen, daher ist es unwahrscheinlich, dass in der offiziellen Dokumentation von Python auf diese verwiesen wird
Question

Ich habe in Python herumgespielt. Ich habe den folgenden Code in IDLE verwendet

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

Die Ausgabe war

[1, [...], 2]

Was ist das […]? Interessanterweise könnte ich dies jetzt als eine Liste von Listen bis unendlich verwenden, dh

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

Ich könnte so lange schreiben wie ich wollte und es würde immer noch funktionieren.

BEARBEITEN:

  • Wie ist es in der Erinnerung dargestellt?
  • Was nutzt es? Beispiele für einige Fälle, in denen es nützlich ist, wären hilfreich.
  • Jeder Link zur offiziellen Dokumentation wäre wirklich nützlich.



Der Name dieses speziellen Objekts ist die Ellipse. Ich nehme an, dass es als ein Singleton-Objekt im Python-Interpreter / VM implementiert ist - etwas wie None --- ein Sentinel von Art. Wie Sie gesehen haben, ist es für Python eine Möglichkeit, die Referenz einer Liste in sich selbst darzustellen.




Das machen wir in der objektorientierten Programmierung immer. Wenn zwei Objekte sich direkt oder indirekt aufeinander beziehen, sind sie beide unendlich rekursive Strukturen (oder beide Teil derselben unendlichen rekursiven Struktur, je nachdem, wie man sie betrachtet). Das ist der Grund, warum man so etwas nicht so primitiv sieht wie eine Liste - weil wir das Konzept normalerweise besser als miteinander verbundene "Objekte" beschreiben als eine "unendliche Liste".

Sie können auch ... mit einem unendlich rekursiven Wörterbuch erhalten. Nehmen wir an, Sie möchten ein Wörterbuch der Ecken eines Dreiecks, wobei jeder Wert ein Wörterbuch der anderen Ecken ist, die mit dieser Ecke verbunden sind. Du könntest es so einrichten:

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

Wenn Sie nun ein triangle (oder a oder b oder c ) drucken, sehen Sie, dass es voller {...} weil sich zwei beliebige Ecken auf einander beziehen.




Dies ist, was Ihr Code erstellt hat

Es ist eine Liste, in der das erste und das letzte Element auf zwei Zahlen (1 und 2) zeigen und das mittlere Element auf die Liste selbst zeigt.

Wenn in Common Lisp das Drucken von kreisförmigen Strukturen aktiviert ist, wird ein solches Objekt als gedruckt

#1=#(1 #1# 2)

Dies bedeutet, dass es ein Objekt gibt (mit 1 mit #1= ), das ein Vektor mit drei Elementen ist, das zweite ist das Objekt selbst (mit #1# referenziert).

In Python erhalten Sie nur die Information, dass die Struktur zirkulär ist mit [...] .

In diesem speziellen Fall ist die Beschreibung nicht mehrdeutig (sie zeigt rückwärts auf eine Liste, aber es gibt nur eine Liste, also muss es diese sein). In anderen Fällen kann jedoch mehrdeutig sein ... zum Beispiel in

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

Die Rückwärtsreferenz könnte entweder zur äußeren oder zur inneren Liste gehören. Diese zwei verschiedenen Strukturen, die auf die gleiche Weise gedruckt werden, können mit erstellt werden

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

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

print x, y

und sie würden in Erinnerung sein als




Wie ich verstanden habe, ist dies ein Beispiel für einen Fixpunkt

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



Auf die Frage "Was nützt es?", Hier ein konkretes Beispiel.

Graph Reduction ist eine Evaluierungsstrategie, die manchmal verwendet wird, um eine Computersprache zu interpretieren. Dies ist eine gemeinsame Strategie für eine verzögerte Bewertung, insbesondere von funktionalen Sprachen.

Der Ausgangspunkt ist, ein Diagramm zu erstellen, das die Abfolge der "Schritte" darstellt, die das Programm ausführen wird. Abhängig von den in diesem Programm verwendeten Kontrollstrukturen kann dies zu einem zyklischen Graphen führen (weil das Programm eine Art "forever" -Schleife enthält - oder eine Rekursion verwenden, deren "Tiefe" zum Zeitpunkt der Auswertung bekannt sein wird, nicht jedoch Erstellungszeit ) ...

Um einen solchen Graphen darzustellen, benötigen Sie unendlich viele "Datenstrukturen" (manchmal rekursive Datenstrukturen genannt), wie Sie sie bemerkt haben. In der Regel ein bisschen komplexer.

Wenn Sie sich für dieses Thema interessieren, gibt es (neben vielen anderen) einen Vortrag zu diesem Thema:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf