209 votes

Comment créer des noms de variables différents dans une boucle ?

A titre d'exemple...

for x in range(0,9):
    string'x' = "Hello"

Donc je me retrouve avec string1, string2, string3... tous équivalents à "Hello".

42 votes

La réponse est que vous ne voulez pas faire cela. Utilisez plutôt une liste.

2 votes

Si c'est là que vous voulez l'utiliser vous pouvez avoir x = ["Hello" * 9] puis y accéder par x[0], x[1] ... Si vous voulez l'utiliser d'une manière différente, je pense que vous devrez nous donner plus de détails sur le code.

3 votes

Si j'ai un jour le pouvoir sur un langage, alors l'utilisation de nombres dans les noms de variables me donnera SyntaxError: Use a data structure. ;-)

239voto

the wolf Points 10164

Bien sûr que vous pouvez ; ça s'appelle un dictionnaire :

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"

>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

J'ai dit cela un peu à la légère, mais le meilleur moyen d'associer une valeur à une autre est un dictionnaire. C'est pour cela qu'il a été conçu !

55 votes

Ceci ne devrait pas être marqué comme la bonne réponse parce que ce n'est pas le cas ; il s'agit d'un dictionnaire, pas d'une affectation dynamique de variable, ce qui est ce que le PO demandait.

117voto

Tadeck Points 37046

C'est vraiment une mauvaise idée, mais...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

et ensuite, par exemple :

print(string3)

vous donnera :

Hello

Il s'agit toutefois d'une mauvaise pratique. Vous devriez plutôt utiliser des dictionnaires ou des listes, comme d'autres le proposent. À moins, bien sûr, que vous ne vouliez vraiment savoir comment faire, mais que vous ne vouliez pas l'utiliser.

4 votes

Pouvez-vous expliquer pourquoi c'est une mauvaise idée ?

11 votes

@paintedcones : D'abord, il devrait y avoir un seul moyen de le faire L'utilisation de dictionnaires simples est plus naturelle. Utiliser le dictionnaire globals à la place est une mauvaise idée, car il crée aussi "implicitement" des variables globales ou les modifie. Puisque la création et la modification de variables de cette manière nécessitent la notation par dictionnaire, il n'y a aucune raison d'utiliser globals() au lieu d'un simple dict .

0 votes

Il y a quelques situations où vous avez besoin de faire un tas de variables, x1, x2, x3, etc. Mais dans la plupart des situations, l'utilisation d'un dictionnaire est vraiment la chose la plus appropriée à faire.

52voto

Collin W. Points 327

Une façon de le faire est d'utiliser exec() . Par exemple :

for k in range(5):
    exec(f'cat_{k} = k*2')

>>> print(cat_0)
0
>>> print(cat_1)
2
>>> print(cat_2)
4
>>> print(cat_3)
6
>>> print(cat_4)
8

Ici, je profite du formatage pratique de la chaîne de caractères f dans Python 3.6+.

15 votes

Souvenez-vous de exec quelque chose quelque chose, de la magie noire, des vulnérabilités d'attaque, de mauvaises choses, mais cela répond à la question posée.

26voto

Jochen Ritzel Points 42916

Il est tout simplement inutile de créer des noms de variables. Pourquoi ?

  • Ils sont inutiles : Vous pouvez tout stocker dans des listes, des dictionnaires, etc.
  • Ils sont difficiles à créer : Vous devez utiliser exec o globals()
  • Vous ne pouvez pas les utiliser : Comment écrire du code qui utilise ces variables ? Vous devez utiliser exec/globals() à nouveau

Utiliser une liste est beaucoup plus facile :

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them

0 votes

Merci ! J'avais besoin de choisir la forme parmi le dictionnaire ou la liste de dataframe. Et comme j'avais besoin de réorganiser le dataframe en fonction d'une certaine valeur sur le dataframe, je ne pouvais pas utiliser la forme dictionnaire. Oui, vous avez raison ! Dans certains cas, il est vraiment inutile de créer des noms de variables !

12voto

Aaron Goldman Points 579

Ne faites pas ça, utilisez un dictionnaire

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

ne faites pas cela, utilisez un dict

globals() présente un risque car il vous donne ce vers quoi l'espace de nom pointe actuellement, mais cela peut changer et modifier le retour de globals() n'est pas une bonne idée.

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