203 votes

Ce qui est [...] Python 2.7 ?

J'ai été jouer autour en python. J'ai utilisé le code suivant dans le vide

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

La sortie a été

[1, [...], 2]

Qu'est-ce que cette [...]? Il est intéressant de noter que je pouvais maintenant l'utiliser comme une liste de liste de liste jusqu'à l'infini c'est à dire

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

Je pourrais écrire ci-dessus aussi longtemps que je le voulais et il fonctionne encore.

EDIT:

  • Comment est-il représenté dans la mémoire?
  • Quelle est son utilisation? Quelques exemples de cas où il est utile serait utile.
  • Un lien vers la documentation officielle qui serait vraiment utile.

327voto

6502 Points 42700

C'est ce que votre code créé

enter image description here

C'est une liste où les premier et dernier éléments pointent à deux chiffres (1 et 2) et où le moyen de l'élément de pointe de la liste elle-même.

En Common Lisp lors de l'impression de structures circulaires est permis à un tel objet serait imprimé en tant que

#1=#(1 #1# 2)

ce qui signifie qu'il est un objet (étiqueté avec les 1 #1=) qui est un vecteur à trois éléments, la seconde étant l'objet lui-même (à l'arrière-référencées avec des #1#).

En Python au lieu de cela, vous obtenez juste l'information que la structure est circulaire avec [...].

Dans ce cas précis, la description n'est pas ambigu (c'est en arrière pointant vers une liste, mais il y a une seule liste donc ça doit être ça). Dans d'autres cas peut être toutefois ambiguë... par exemple dans

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

la référence arrière pourrait soit à l'extérieur ou à l'intérieur de la liste. Ces deux structures différentes imprimé de la même façon peut être créé avec

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

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

print x, y

et ils seraient dans la mémoire de

enter image description here

117voto

Óscar López Points 97105

Cela signifie que vous avez créé une liste infinie imbriquée à l'intérieur d'elle-même, qui ne peut pas être imprimée. p contient p qui contient p ... et ainsi de suite. L' [...] notation est une façon de vous dire cela, et pour l'informer qu'il ne peut pas être représentée! Jetez un oeil à @6502 la réponse de voir une belle photo illustrant ce qui se passe.

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

  • Cette réponse semble pour le couvrir
  • Ignacio lien décrit quelques utilisations possibles
  • Ce n'est plus un sujet de la structure de données la conception de langages de programmation, il est donc peu probable qu'une référence est trouvée dans la documentation officielle de Python

23voto

Sylvain Leroux Points 9401

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

Graphique de réduction est une stratégie d'évaluation parfois utilisés afin d'interpréter un langage informatique. C'est une stratégie commune pour les paresseux de l'évaluation, notamment des langages fonctionnels.

Le point de départ est de construire un graphe représentant la séquence des "étapes", le programme va prendre. Selon le contrôle des structures utilisées dans le programme, cela pourrait conduire à un cyclique graphique (parce que le programme contient une sorte de "pour toujours" de la boucle -- ou utiliser la récursivité dont la "profondeur" seront connus à l'évaluation en temps, mais pas au graphique-création de temps)...

Afin de représenter ce graphe, vous avez besoin d' infini "structures de données" (parfois appelé récursive des structures de données), comme celle que vous avez remarqué. Habituellement, un peu plus complexe.

Si vous êtes intéressé par ce sujet, ici, c'est (entre autres) une conférence sur le sujet:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

8voto

nmclean Points 4251

Nous le faisons tout le temps dans la programmation orientée objet. Si les deux objets font référence les uns aux autres, directement ou indirectement, ils sont à la fois infiniment structures récursives (ou les deux de la même infiniment structure récursive, selon la façon dont vous le regardez). C'est pourquoi vous ne voyez pas beaucoup en quelque chose d'aussi primitif qu'une liste, parce que nous sommes généralement mieux décrire le concept comme interconnectés "objets" qu'une "liste infinie".

Vous pouvez également obtenir de l' ... avec une infinie récursive dictionnaire. Disons que vous voulez un dictionnaire des angles d'un triangle, où chaque valeur est un dictionnaire de l'autre coins reliés à ce coin. Vous pouvez l'installer 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 d' {...} parce que tout les deux angles sont se référant à dos les uns aux autres.

4voto

Firegun Points 4018

Si j’ai bien compris, il s’agit d’un exemple de point fixe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X