2012-07-19 4 views
58

Possible en double:
How do I do variable variables in Python?En utilisant une variable de chaîne comme un nom de variable

J'ai une variable avec une chaîne qui lui est assignée et je veux définir une nouvelle variable en fonction de cette chaîne.

foo = "bar" 
foo = "something else" 

# What I actually want is: 

bar = "something else" 
+14

Vous ne voulez probablement pas cela. Pourquoi essayez-vous de le faire? – JBernardo

+2

Non, vous ne le faites pas. La raison pour laquelle vous devez utiliser 'exec' est parce que' locals() 'ne supporte pas les modifications. 'locals()' ne supporte pas les modifications car cela rendrait l'implémentation plus complexe et plus lente et n'est jamais ** une bonne idée –

+1

Message similaire: http://stackoverflow.com/questions/1373164/ how-do-i-do-variable-variables-in-python – Kartik

Répondre

107

Vous pouvez utiliser exec pour que:

>>> foo = "bar" 
>>> exec(foo + " = 'something else'") 
>>> print bar 
something else 
>>> 
+52

+1 parce qu'il a répondu à la question (aussi mauvaise idée que cela puisse être). – mgalgs

+0

C'est la meilleure réponse, mais ça ne marche pas pour moi. Peut-être que c'est en raison de ma portée. Cela fonctionne dans un fichier simple comme celui de votre exemple, mais je suis dans une méthode d'une classe essayant de définir des variables locales, et elles ne sont pas définies. – sudo

91

Vous serez beaucoup plus heureux en utilisant un dictionnaire à la place:

my_data = {} 
foo = "hello" 
my_data[foo] = "goodbye" 
assert my_data["hello"] == "goodbye" 
+22

Il ne semble pas répondre à la question. – dnsmkl

+2

Oui. Cela peut être utile, mais ce n'était pas ce que le PO demandait. – sudo

+19

Je suis content de voir que la réponse est toujours là. Je pense que nous pouvons faire confiance aux lecteurs de Stack Overflow pour juger par eux-mêmes si une réponse répond à leurs besoins. Cette réponse ne fournit pas de "variables variables", c'est vrai. Mais je vous garantis que 99% des personnes qui les recherchent seront plus heureux d'avoir trouvé des dictionnaires. –

59

Vous pouvez utiliser setattr

name= 'varname' 
value= 'something' 

setattr(self, name, value) #equivalent to: self.varname= 'something' 

print self.varname 
#will print 'something' 

Mais , puisque vous devriez inf Orm un objet pour recevoir la nouvelle variable, je pense que cela ne fonctionne que dans les classes.

+8

Correct, cela ne fonctionne que dans les classes. – sudo

Questions connexes