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 de slicing


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut probleme de slicing
    bonjour,
    j'ai une class dont __init__ modifie une liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TimerList = []
    class TimeEvent :
     
    	def __init__(self,TimerList=TimerList) :
    		TimeList = TimerList[0:] + [self]
                   #TimerList.append(self)
    si on utilide la methode .append(), la liste est correcte dans la fonction et en dehors de la fonction, donc pàas de probleme.
    si on utilise la methode du slicing(ligne non commentée), la liste est correcte dans la fonction mais erronnée en dehors.
    Pourquoi celà, et quelle methode utiliser pour insérer un élément au milieu d'une liste ?
    merci.

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Lorsque tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TimeList = TimerList[0:] + [self]
    tu ne modifies pas ta variable globale de type liste TimerList, car:
    1. tu réaffectes ta liste modifiée à une variable locale TimeList (!= TimerList, c'était voulu ?)
    2. l'argument TimerList de la méthode __init__ masque la variable globale du même nom. Tu ne peux donc pas y avoir accès depuis le corps de cette méthode.


    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    1. tu réaffectes ta liste modifiée à une variable locale TimeList (!= TimerList, c'était voulu ?)

    non, cest une erreur de recopie

    2. l'argument TimerList de la méthode __init__ masque la variable globale du même nom. Tu ne peux donc pas y avoir accès depuis le corps de cette méthode.

    ok, mais pourquoi ça marche avec la methode append() alors ?

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par josmiley Voir le message
    ok, mais pourquoi ça marche avec la methode append() alors ?
    Parce qu'avec append(), tu modifies la liste pointée par l'argument TimerListe en place, alors qu'avec la deuxième, tu affectes une nouvelle liste à cette variable.

    Les choses te paraîtront certainement moins obscures si tu nommes ton paramètre avec un identificateur différent de TimerList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TimerList = []
    class TimeEvent :
     
    	def __init__(self, tlist=TimerList) :
                    global TimerList
    		TimerList = tliste[0:] + [self]
                   #TimerList.append(self)
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    ha okééé ...
    mais du coup, l'utilation de 'global' evite le passage de l'argument TimerList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, tlist=TimerList)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self)
         global TimerList
    c'est plus clair je trouve, merci Thierry.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par josmiley Voir le message
    ha okééé ...
    mais du coup, l'utilation de 'global' evite le passage de l'argument TimerList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, tlist=TimerList)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self)
         global TimerList
    c'est plus clair je trouve, merci Thierry.
    Par contre, l'usage du mot clé global n'est pas tellement conseillé ici. Perso, je ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TimerList = []
    class TimeEvent :
     
    	def __init__(self, timers=TimerList) :
                   timers.append(self)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class TimeEvent :
    	timers = []
    	def __init__(self) :
                   TimeEvent.timers.append(self)
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Par contre, l'usage du mot clé global n'est pas tellement conseillé ici.
    je lis souvent que global c'est mal. Mais il doit bien avoir une utilité, quel est le danger à utiliser global ?

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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