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 :

Bizarrerie Python 2.7


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Bizarrerie Python 2.7
    Bonjour,
    En voulant approfondir le langage, je suis tombé sur ce cas :
    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
     
    >>> larg,long=2,3
    >>> p=[[(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>> q=[[(1,2,3)]*larg]*long
    >>> p==q
    True
    >>> p[1][0]=(4,5,6)
    >>> q[1][0]=(4,5,6)
    >>> p==q
    False
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>> q
    [[(4, 5, 6), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)]]
    >>>
    Si quelqu'un pouvait m'expliquer ou m'orienter.
    Pourquoi ma manip sur q ne fonctionne pas comme avec p ?
    NB : Je suis sous XP SP3 avec Python 2.7
    Gérard

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p = [[1,2,3],[1,2,3],[1,2,3]]
    q = [[1,2,3]]*3
    p contient 3 listes différentes contenant les même valeurs
    q contient 3 fois la même liste

    pour s'en convaincre essayons ce code qui retourne les identifiants de chaque sous-liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in p: print i, 'a pour id : ',id(i)
    for i in q: print i, 'a pour id : ', id(i)
    et comparons les résultats ...

  3. #3
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    À mon avis, c’est simplement parce que l’opération * sur une liste fait une copie simple, et pas une deepcopy. Donc, tu as trois fois le même objet (la même liste, le produit de [(1,2,3)]*larg ) dans q…

    [EDIT] Bah, grillé…

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Mon but est d'avoir une représentation des pixels d'une image avec pour chaque pixel la couleur RGB que je puisse modifier.
    Voilà à quoi j'arrive et qui me convient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> larg,haut=2,3
    >>> p=[]
    >>> for i in range(haut):
    ...   p.append([])
    ...   for j in range(larg):
    ...     p[i].append((1,2,3))
    ...
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>> x,y=1,0
    >>> p[x][y]=(4,5,6)
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>>
    S'il y avait une solution plus évidente qui vous vienne immédiatement en tête, je suis preneur.
    En tous cas merci pour vos réponses.
    Gérard

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Tu pourrais juste utiliser les list comprehensions, plus concises*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> larg,haut=2,3
    >>> p = [[(1, 2, 3) for i in range(larg)] for j in range(haut)]
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>> x,y=1,0
    >>> p[x][y]=(4,5,6)
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>>
    ou encore*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> larg,haut=2,3
    >>> p = [[(1, 2, 3)]*larg for j in range(haut)]
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>> x,y=1,0
    >>> p[x][y]=(4,5,6)
    >>> p
    [[(1, 2, 3), (1, 2, 3)], [(4, 5, 6), (1, 2, 3)], [(1, 2, 3), (1, 2, 3)]]
    >>>
    Car la première “multiplication” s’opérant sur une liste d’éléments immutables (le tuple (1,2,3)), il n’y a pas de problème de shallow copy

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Exactement ce que j'espérais. Je regarde donc cette notion de "Compréhensions de listes".
    Grand Merci
    Gérard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  2. Une ch'tite bizarrerie dans les Updates de SQL Server
    Par Wakko2k dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 08/04/2004, 14h14
  3. Réponses: 4
    Dernier message: 19/03/2004, 11h48
  4. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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