Python 3.7.2 : Problème avec setattr et variable de type liste [Résolu]

Signaler
-
 Phil_1857 -
Bonjour,

Le code suivant fonctionne parfaitement :

class Glob():

n = 0
prev_n = 0
x=[0,0]
prev_x = [6,0]

setattr(Glob, 'prev_n', 5)
print('\nGlob.prev_n =',Glob.prev_n) # affiche 5

Par contre, si la variable a mettre à jour est une liste, rien ne se passe:

setattr(Glob, 'prev_x[0]',12)
print('\nGlob.prev_x[0] =',Glob.prev_x[0]) # affiche 6

Si quelqu'un a une idée ou bien une solution de contournement …
Merci d'avance

3 réponses

Bonjour,

setattr sert à donner une autre valeur à l'attribut donné d'un objet donné.
Ce que tu veux faire (pourquoi et dans quel but ?) est de modifier une valeur d'une liste.

Alors il faut simplement récupérer l'attribut de l'objet et changer la valeur de tel élément.

class Glob:
    def __init__(self):
        self.x = [0, 0]

glob = Glob()
getattr(glob, 'x')[0] = 1
Bonjour Trifou,

Mais oui, comment n'y ai-je pas pensé ?
Ca fonctionne, merci !

Avant de fermer ce post, je te donne pour info ce que je veux faire:

En fait, ma classe Glob ne sert pas à créer des instances mais à stocker des variables globales, je sais qu'il n'est pas très conseillé d'en utiliser, mais j'ai beaucoup de variables et ça me parait plus élégant comme ça
(il n'y a plus de déclarations global .. dans chacune de mes fonctions)

J'ai une fonction qui sert a enregistrer la valeur d'une variable en tant que valeur précédente, la valeur courante étant appelée à être changée plus tard, ex : la valeur courante de toto doit être stockée dans prev_toto

Or, je passe en argument à ma fonction non pas Glob.toto mais la chaine de caractères var contenant Glob.toto, et je fais donc l'opération suivante (les 1er et 3eme arguments étants des chaines de caractères) :

c,v = var.split('.') # c = 'Glob', et v =' toto'
setattr(globals()[c], 'prev_'+v, eval(var)) #Glob.prev_toto = Glob.toto !

Je vais pouvoir modifier ça pour le cas ou variable = liste
Encore merci
Je crois qu'il faut que tu commences à t'intéresser à programmer en objets.

Ce n'est pas possible de faire des choses comme ça :-/
En programmation, on évite absolument l'utilisation de eval
Hé oui je sais bien … :-)

Je vais me pencher sur la question plus en détails

En tous cas, merci pour tes remarques judicieuses !

Je ferme ce post