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 Liste von Listen von Listen bis unendlich verwenden, dh
p[1][1][1]....
Ich könnte das oben genannte schreiben, solange ich wollte und es würde immer noch funktionieren.
BEARBEITEN:
- Wie wird 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.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
quelle
quelle
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. Was bist du gelaufen?Antworten:
Dies bedeutet, dass Sie eine unendliche Liste erstellt haben, die in sich selbst verschachtelt ist und nicht gedruckt werden kann.
p
enthältp
was enthältp
... und so weiter. Die[...]
Notation ist eine Möglichkeit, Sie darüber zu informieren und zu informieren, dass sie nicht dargestellt werden kann! Schauen Sie sich die Antwort von @ 6502 an, um ein schönes Bild zu sehen, das zeigt, was passiert.Nun zu den drei neuen Elementen nach Ihrer Bearbeitung:
quelle
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 in der das mittlere Element auf die Liste selbst zeigt.
In Common Lisp wird ein solches Objekt gedruckt, wenn das Drucken kreisförmiger Strukturen aktiviert ist
Dies bedeutet, dass es ein Objekt (mit 1 bezeichnet
#1=
) gibt, das ein Vektor mit drei Elementen ist, wobei das zweite das Objekt selbst ist (auf das mit zurück verwiesen wird#1#
).In Python erhalten Sie stattdessen nur die Informationen, mit denen 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, also muss es diese sein). In anderen Fällen kann es jedoch mehrdeutig sein ... zum Beispiel in
Die Rückwärtsreferenz könnte entweder auf die äußere oder auf die innere Liste verweisen. Diese beiden unterschiedlichen Strukturen, die auf dieselbe Weise gedruckt wurden, können mit erstellt werden
und sie würden in Erinnerung bleiben als
quelle
[1, [2, [...], 3]]
:x[1] = [2, [...], 3]
undy[1] = [2, 1, [...]], 3]
. Dies bedeutet, dass x aus einer 1 besteht und dann 2s wiederholt, während y aus abwechselnden 1s und 2s besteht.#(1 #1=#(2 #1# 3))
fürx
und#1=#(1 #(2 #1# 3))
füry
.#1=(1 . #1#)
.Auf die Frage "Was nützt es?" Ist hier ein konkretes Beispiel.
Die Grafikreduzierung ist eine Bewertungsstrategie, die manchmal verwendet wird, um eine Computersprache zu interpretieren. Dies ist eine gängige Strategie für die verzögerte Bewertung, insbesondere von Funktionssprachen.
Der Ausgangspunkt besteht darin, 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 Diagramm führen (da das Programm eine Art "für immer" -Schleife enthält - oder eine Rekursion verwenden, deren "Tiefe" zum Auswertungszeitpunkt bekannt ist, jedoch nicht zum Diagramm. Erstellungszeit ) ...
Um einen solchen Graphen darzustellen, benötigen Sie unendliche "Datenstrukturen" (manchmal auch genannt) rekursive Datenstrukturen bezeichnet), wie die, die Sie bemerkt haben. Normalerweise etwas komplexer.
Wenn Sie sich für dieses Thema interessieren, finden Sie hier (unter anderem) einen Vortrag zu diesem Thema:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
quelle
Wir machen das die ganze Zeit in der objektorientierten Programmierung. Wenn zwei Objekte direkt oder indirekt aufeinander verweisen, handelt es sich um unendlich rekursive Strukturen (oder um Teile derselben unendlich rekursiven Struktur, je nachdem, wie Sie sie betrachten). Deshalb sieht man in etwas so Primitivem wie einer Liste nicht so viel - 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 erhalten. 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:Wenn Sie jetzt drucken
triangle
(odera
oderb
oderc
für diese Angelegenheit), werden Sie sehen, dass es voll ist,{...}
weil sich zwei beliebige Ecken aufeinander beziehen.quelle
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
eingeben, um das hübsche Drucken auszuschalten, wird es angezeigt...
.Wie ich verstanden habe, ist dies ein Beispiel für einen festen Punkt
quelle
p = [1]; p[0] = p
Beispiel ausprobiert hatte, dasf = lambda x:x[0]
funktionieren muss. Es ist ein Beispiel für einen Fixpunkt, aber ich konnte noch nicht erkennen, wie nützlich es ist, dies zu wissen. Der tatsächliche Wert des Fixpunkts wird rekursiv oder iterativ von einem anderen Punkt aus erreicht. Ein Beispiel, das zeigt, wie die Listenstruktur der ursprünglichen Frage zum Erstellen des Y-Kombinators verwendet wird, wäre hilfreich, wenn dies möglich ist.q = lambda: q
macht ein unendlich aufrufbares LambdaDer Name dieses speziellen Objekts ist die Ellipse. Ich denke, dass es als Singleton-Objekt im Python-Interpreter / VM implementiert ist - so etwas wie None - eine Art Sentinel. Wie Sie gesehen haben, ist es für Python eine Möglichkeit, die Referenz einer Liste in sich selbst darzustellen.
quelle