Je veux créer des variables dynamiquement en Python. Quelqu'un a-t-il des moyens créatifs de le faire ?
- Comment puis-je créer des variables variables? (19 réponses )
Réponses
Trop de publicités?À 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.
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}
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
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'}
>>>