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.
ÉDITER:
- 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.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
la source
la source
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. Qu'avez-vous couru?Réponses:
Cela signifie que vous avez créé une liste infinie imbriquée en elle-même, qui ne peut pas être imprimée.
p
contientp
qui contientp
... et ainsi de suite. 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 image montrant ce qui se passe.Maintenant, concernant les trois nouveaux éléments après votre modification:
la source
C'est ce que votre code a créé
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.
En Common Lisp, lorsque l'impression de structures circulaires est activée, un tel objet sera imprimé sous la forme
ce qui signifie qu'il existe un objet (étiqueté 1 avec
#1=
) qui est un vecteur à trois éléments, le second étant l'objet lui-même (référencé avec#1#
).En Python, vous obtenez simplement les informations avec lesquelles la structure est circulaire
[...]
.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
la référence arrière pourrait pointer vers la liste externe ou vers la liste interne. Ces deux structures différentes imprimées de la même manière peuvent être créées avec
et ils seraient en mémoire
la source
[1, [2, [...], 3]]
suit:x[1] = [2, [...], 3]
ety[1] = [2, 1, [...]], 3]
. Cela signifie que x consiste en un 1 puis en répétant 2, tandis que y consiste à alterner 1 et 2.#(1 #1=#(2 #1# 3))
pourx
et#1=#(1 #(2 #1# 3))
poury
.#1=(1 . #1#)
.A la question "Quelle est son utilisation", voici un exemple concret.
La réduction des graphes 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 (parce que 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 niveau du graphique- temps de création ) ...
Afin de représenter un tel graphique, vous avez besoin d' infinies «structures de données» (parfois appelées structures de données récursives ), comme celle que vous avez remarquée. Habituellement, un peu plus complexe cependant.
Si vous êtes intéressé par ce sujet, voici (parmi bien d'autres) une conférence sur ce sujet:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
la source
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:Maintenant, si vous imprimez
triangle
(oua
oub
ouc
d'ailleurs), vous verrez qu'il est plein{...}
car deux coins se réfèrent l'un à l'autre.la source
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
pour désactiver la jolie impression, cela s'affichera...
.Si je comprends bien, ceci est un exemple de point fixe
la source
p = [1]; p[0] = p
exemple plus simple qui doitf = lambda x:x[0]
fonctionner. C'est un exemple de point fixe, mais je n'ai pas encore pu voir à quel point le savoir est utile. La valeur réelle du point fixe est d'y arriver à partir d'un autre point de manière récursive ou itérative. Un exemple qui montre comment utiliser la structure de liste de la question d'origine pour créer le combinateur Y serait utile s'il est possible.q = lambda: q
fait un lambda infiniment appelableLe nom de cet objet spécial est les points de suspension. Je suppose qu'il est implémenté en tant qu'objet singleton dans l'interprète / VM Python - quelque chose comme None - une sorte de sentinelle. Comme vous l'avez vu, c'est un moyen pour Python de représenter la référence d'une liste en lui-même.
la source