it-swarm.com.de

Was bedeuten [...] Auslassungspunkte in einer Liste?

Ich habe in Python rumgespielt. 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 Liste von Listen bis unendlich verwenden, d. H.

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

Ich könnte das oben genannte schreiben, solange ich wollte und es würde immer noch funktionieren.

BEARBEITEN:

  • Wie ist es im Gedächtnis dargestellt?
  • Was nützt 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.
187
Aseem Bansal

Dies bedeutet, dass Sie eine unendliche Liste in sich selbst erstellt haben, die nicht gedruckt werden kann. p enthält p, das p enthält ... und so weiter. Das [...] Notation ist eine Möglichkeit, Sie darüber zu informieren und Sie darüber zu informieren, dass es nicht dargestellt werden kann! Schauen Sie sich die Antwort von @ 6502 an, um ein schönes Bild zu sehen, das zeigt, was gerade passiert.

Nun zu den drei neuen Elementen nach der Bearbeitung:

  • Diese Antwort scheint es zu decken
  • Ignacios Link beschreibt einige Verwendungsmöglichkeiten
  • Dies ist eher ein Thema des Datenstrukturdesigns als der Programmiersprachen. Daher ist es unwahrscheinlich, dass in der offiziellen Dokumentation von Python eine Referenz gefunden wird
105
Óscar López

Dies ist, was Ihr Code erstellt hat

enter image description here

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

In Common LISP würde bei aktiviertem Druck kreisförmiger Strukturen ein solches Objekt gedruckt als

#1=#(1 #1# 2)

dies bedeutet, dass es ein Objekt gibt (mit #1= als 1 bezeichnet), das einen Vektor mit drei Elementen darstellt, wobei das zweite Objekt selbst ist (mit #1# rückverweist).

In Python stattdessen erhalten Sie mit [...] Nur die Information, dass die Struktur kreisförmig ist.

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

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

die Rückwärtsreferenz könnte entweder auf die äußere oder auf die innere Liste verweisen. Diese zwei unterschiedlichen Strukturen, die auf die gleiche Weise gedruckt wurden, 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)
print(y)

und sie würden in Erinnerung bleiben als

enter image description here

309
6502

Auf die Frage "Was nützt es?" Folgt hier ein konkretes Beispiel.

Graph Reduction ist eine Auswertungsstrategie, mit der manchmal eine Computersprache interpretiert wird. Dies ist eine gängige Strategie für die verzögerte Evaluierung, insbesondere von funktionalen Sprachen.

Der Ausgangspunkt ist die Erstellung eines Graphen, der die Abfolge der "Schritte" darstellt, die das Programm ausführen wird. Abhängig von den in diesem Programm verwendeten Kontrollstrukturen kann dies zu einer zyklischen Grafik führen (da das Programm eine Art "forever" -Schleife enthält - oder eine Rekursion verwenden, deren "Tiefe" bekannt ist um Auswertung Zeit, aber nicht um Graph-Erstellung Zeit) ...

Um einen solchen Graphen darzustellen, benötigen Sie unendlich "Datenstrukturen" (manchmal rekursiv Datenstrukturen), wie Sie es bemerkt haben. Normalerweise etwas komplexer.

Wenn Sie sich für dieses Thema interessieren, finden Sie hier (unter anderem) eine Vorlesung zu diesem Thema:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

21
Sylvain Leroux

Das machen wir ständig in der objektorientierten Programmierung. Wenn zwei Objekte direkt oder indirekt aufeinander verweisen, sind sie beide unendlich rekursive Strukturen (oder beide Teile derselben unendlich rekursiven Struktur, je nachdem, wie Sie sie betrachten). Das ist der Grund, warum Sie in etwas so Primitivem wie einer Liste nicht so viel sehen - weil wir das Konzept normalerweise besser als miteinander verbundene "Objekte" beschreiben als als eine "unendliche Liste".

Sie können auch ... mit einem unendlich rekursiven Wörterbuch. Angenommen, 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. Sie könnten 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 triangle (oder a oder b oder c) drucken, sehen Sie, dass es voll von {...} weil sich zwei beliebige Ecken aufeinander beziehen.

7
nmclean

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

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