9
votes

Utilisez Itérateur comme nom de variable dans la boucle Python

Je me demandais s'il existe un moyen d'utiliser un itérateur comme nom de variable dans une boucle Python. Par exemple, si je voulais créer des objets v0 code>, v1 code>, v2 code> est un moyen de faire quelque chose comme ceci:

for i in range(3):
    v + str(i) = i**2


6 commentaires

Qu'est-ce que cela a à voir avec la question de votre titre? Mieux encore, pourquoi voudriez-vous vouloir faire cela?


Il existe des moyens de le faire, mais vous feriez probablement mieux d'affecter à une autre liste, puis d'accéder à cette liste par index.


J'ai changé le nom de la question. J'ai rencontré des situations où il serait utile de stocker ou de référencer des données de cette manière particulière (je sais qu'il existe d'autres moyens, mais cela serait utile parfois).


Montrez-moi un exemple de situation où cela serait meilleur qu'une liste .


Il faut être capable de noter un thème commun parmi les réponses [acceptées]: Stackoverflow.com/Questtions/1373164/... , Stackoverflow.com/questions/4277056/... , Stackoverflow.com/questions/ 6677424 / ...


@pst, je pense que cette question compte vraiment comme une duplicate de ce premier.


5 Réponses :


9
votes

la méthode intégrée globals () renvoie un dictionnaire représentant le courant Tableau des symboles globaux.

Vous pouvez ajouter une variable à global comme ceci: xxx

fyi : c'est La réponse à votre question mais certainement pas la voie recommandée. Manipulation directe globals est la solution de piratage pouvant être évitée principalement d'être une alternative plus propre. ( Voir d'autres commentaires dans ce fil )


8 commentaires

+1 parce que cela le résout. Je ne recommanderais pas de le faire, mais cela le résout. Vous pouvez également faire quelque chose de similaire avec n'importe quel type de matrice associatif, plutôt que simplement le tableau globals , bien que vous ayez obligé d'accéder au tableau pour l'extraire.


Il y a aussi locals () qui est lié à la portée actuelle.


Je déteste-le quand les gens fournissent des solutions permettant aux gens de faire des choses qu'ils ne devraient pas faire. Je ne sais pas si je devrais indiquer cela pour encourager une mauvaise idée ou non, car c'est juste ce que l'OP a demandé.


Certains apportent simplement des réponses aux questions tandis que d'autres débattent sur la recherche d'une meilleure façon de réaliser quelque chose. Je pense que c'est le mélange des deux types de réponses qui le rend si précieux. (mais je partage votre point de vue selon lequel utiliser Globals n'est pas la voie recommandée pour aller)


locaux () ne fonctionnera généralement pas (si utilisé dans une fonction, où vous voudriez l'utiliser), cependant. Vous pouvez lui attribuer, mais l'affectation ne sera pas reflétée dans vos variables réelles.


Il h. D'accord, un +1 pour répondre à la question :) Cependant, lorsque vous suggérez quelque chose ... "Généralement fronça les sourcils" ... Comme ça, il est souvent préférable de signaler les problèmes généraux / limitations dans la réponse elle-même. (J'ai utilisé les deux globals () et locaux () avant, mais dans très circonstances spéciales.)


Je suis déconcerté sur la raison pour laquelle quelqu'un voudrait essayer de créer des variables variables à Python? Pour moi, il semble que vous n'ayez pas eu de poignée aux variables que vous venez de faire et que vous devriez aller creuser à travers global ou local pour les trouver. Est-ce que l'OP peut changer la question à "Pourquoi quiconque créerait-il des variables variables dans py?" Donc, je peux voir une réponse?


@JDI parce que ladite personne utilise telle dans une autre langue / environnement et sont toujours dans ladite mentalité :) - il ressemble à r supporter cela (je n'ai jamais utilisé R) et, au moins un code PHP plus ancien, abusé fortement de cette construction.



6
votes

Bien que cela ne tente pas de répondre directement à la question (voir GECCOS Réponse pour cela), il s'agit généralement de la méthode "approuvée" d'une telle opération: xxx pré>

en général, il est à la fois Nettoyant et plus extensible d'utiliser une ADT (une liste dans ce cas) pour représenter le problème donné que d'essayer de créer des "variables dynamiques" ou "variables variables". p>

codage heureux. P>


Bien que ce qui précède utilise des indices, la forme plus générale de "variables variables" est généralement effectuée avec un dictionnaire: p> xxx pré>

et, pour un fini fixe (et relativement Petit ensemble de variables, "Déballage" peut également être utilisé: P>

v0, v1, v2 = [i**2 for i in range(3)]
print v1 # 1


0 commentaires

1
votes

Je préfère Xrange () à gamme (). Ici le code pour vous: xxx

même si ... Vous devriez envisager d'utiliser une liste


0 commentaires

4
votes

Il y a quelques façons de le faire, le meilleur dépendra de ce que vous voulez réellement faire avec les variables après que vous les avez créées.

globals () et Les locaux () travailleront mais ils ne sont pas ce que vous voulez. EXEC () fonctionnera également mais c'est encore pire que globals () et locaux () .

une compréhension de la liste Comme mentionné par @ user166390 est une bonne idée si v1 , v2 et v3 sont homogènes et que vous voulez juste y accéder par index. xxx

Vous pouvez également le faire, si c'est toujours exactement trois éléments: xxx

c'est bien si les objets sont plus individuels parce que vous pouvez leur donner leurs propres noms.

Une autre option intermédiaire consiste à utiliser un dict : xxx

ou Un raccourci pour ce qui précède à l'aide d'une compréhension dict: xxx


0 commentaires

0
votes
v0 = 0
v200 = 40000
v400 = 160000
v600 = 360000
v800 = 640000

v200 = 40000 (direct v200 value is unchanged)

v200 = 1999 (indirect value from key 40000)
{ '40000': 1999 }

They are equal!
They are equal!

0 commentaires