230 votes

Comment créer dynamiquement des variables ?

Je veux créer des variables dynamiquement en Python. Quelqu'un a-t-il des moyens créatifs de le faire ?

210voto

JoshAdel Points 15911

À moins qu'il n'y ait un besoin écrasant de créer un désordre de noms de variables, j'utiliserais simplement un dictionnaire, où vous pouvez créer dynamiquement les noms de clés et associer une valeur à chacun.

a = {}
k = 0
while k < 10:
    # dynamically create key
    key = ...
    # calculate value
    value = ...
    a[key] = value 
    k += 1

Il y a aussi quelques structures de données intéressantes dans le nouveau modulecollections qui pourraient être applicables.

126voto

eyquem Points 9942

globals() renvoie un dictionnaire des variables du module. Vous pouvez créer une nouvelle variable en créant une clé sur ce dictionnaire :

# By default, a module has some hidden variables defined
print({k: v for k, v in globals().items() if not k.startswith("__")})

for i in range(1, 11):
    globals()[f"my_variable_{i}"] = i

print()
print(my_variable_1)
print(my_variable_2)
# and so on

print()
print({k: v for k, v in globals().items() if not k.startswith("__")})

Résultat :

{}

1
2

{'i': 10, 'my_variable_1': 1, 'my_variable_2': 2, 'my_variable_3': 3, 'my_variable_4': 4, 'my_variable_5': 5, 'my_variable_6': 6, 'my_variable_7': 7, 'my_variable_8': 8, 'my_variable_9': 9, 'my_variable_10': 10}

87voto

chris-piekarski Points 99

Utilisez la méthode exec() pour exécuter du code arbitraire. Par exemple, disons que vous avez un dictionnaire et que vous voulez transformer chaque clé en une variable avec sa valeur de dictionnaire d'origine, vous pouvez faire ce qui suit :

>>> c = {"one": 1, "two": 2}
>>> for k, v in c.items():
...     exec(f"{k} = {v}")
... 
>>> one
1
>>> two
2

40voto

John Machin Points 39706

Remplir les espaces de noms mondiaux et/ou locaux n'est pas une bonne idée. Utiliser une dictée est tellement... d['constant-key'] = value a juste l'air gênant. Python est OO. Dans les mots d'un maître : """Les espaces de noms sont une grande idée klaxonnante - faisons plus de ceux-là !"""

Comme ceci :

>>> class Record(object):
...     pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in zip(names, values):
...     setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>

11voto

peter Points 580
vars()['meta_anio_2012'] = 'translate'

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