IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

probleme avec les attibuts d'objet


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut probleme avec les attibuts d'objet
    Bonjour,
    je débute avec les classes, attributs et méthodes et je bloque vraiment sur un problème

    j'appelle l'attribut d'un objet dans une méthode pour l'utiliser ensuite mais je ne souhaite pas que la valeur de l'attribut change pour l'objet appelé, mais ça ne marche pas:
    en exemple voici ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Essai(object):
        def __init__(self):
            self.a=[]
        def remplissage(self):
            self.a=[1,2,3]
        def methode1(self):
            I=Essai()
            b=self.a    #j'appelle l'attribut a de l'objet self pour l'utiliser dans la variable b
            b[2]=1     #je modifie la liste b
            I.a=b       #je donne au nouvel objet I la liste modifiée
            return I
    G=Essai()
    G.remplissage()
    M=G.methode1()
    print(G.a)
    print(M.a)
    et j'obtiens

    [1, 2, 1]
    [1, 2, 1]

    C'est à dire que l'attribut a de l'objet M a aussi changé alors que je ne le souhaite pas.
    De plus ceci ne se produit pas si je n'utilise pas des listes mais des nombres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Essai(object):
        def __init__(self):
            self.a=[]
        def remplissage(self):
            self.a=10
        def methode1(self):
            I=Essai()
            b=self.a
            b=5
            I.a=b
            return I
    G=Essai()
    G.remplissage()
    M=G.methode1()
    print(G.a)
    print(M.a)
    Là j'obtiens
    10
    5

    la valeur 10 est bien resté dans l'objet G même si je m'en sers dans methode1.
    Bref, si une âme charitable veut bien m'expliquer, je lui en serais grandement reconnaissant!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par cédric25 Voir le message
    Bref, si une âme charitable veut bien m'expliquer, je lui en serais grandement reconnaissant!
    Bonsoir,
    Il serait préférable d'utiliser les balises de code pour que cela soit lisible ("#" au-dessus à droite lors de la création de messages).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> lst = [1, 2, 3]
    >>> id(lst)
    139754973304520
    >>> autre_lst = lst
    >>> id(autre_lst)
    139754973304520
    >>> lst3 = lst[:]
    >>> id(lst3)
    139754973297928
    >>>
    (id renvoie la position en mémoire d'un objet: même valeur = même objet)
    Faire "autre_lst = lst" créé une variable qui pointe sur le même objet (exactement).
    Donc, modification de l'intérieur de l'objet par l'un ou par l'autre revient au même (c'est le même objet).

    Par contre, il est possible de demander explicitement une copie (ce n'est plus le même objet même s'il est identique!)!!

    Cela n'a rien à voir avec les attributs d'objets!!

    Clodion

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ok, merci beaucoup Clodion, C'est bien clair avec la fonction id.

Discussions similaires

  1. probleme avec les pointeurs sur des objet heterogene
    Par Fifou625 dans le forum Débuter
    Réponses: 4
    Dernier message: 09/12/2011, 21h27
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo