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 :

comportement que je ne sais pas expliquer


Sujet :

Python

  1. #1
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut comportement que je ne sais pas expliquer
    Bonjour,

    Voici un truc sur lequel je suis tombé et que je ne m'explique pas. C'est fait en version 2.7. Ça m'est arrivé dans un environnement MacOSX, mais je viens de le reproduire sous Pythonista, une application pour iPad (c'est ce que je copie-colle).

    Voici le code, réduit à sa plus simple expression, bien sûr :

    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
    >>> def fonction(Z=False):
    ...     xy_list = [ (0.,0.) ]
    ...     if Z:
    ...         z_list = [ 0. ]
    ...     return xy_list, z_list if Z else xy_list
    ... 
    >>> 
    >>> fonction(True)
    ([(0.0, 0.0)], [0.0])
    >>>
    >>> fonction(False)
    ([(0.0, 0.0)], [(0.0, 0.0)])
    >>>
    >>> result = fonction(False)
    >>> id(result[0]), id(result[1])
    (52130156, 52130156)
    Qu'ai-je manqué ?

    ÉDIT: l'appel de fonction sans argument (donc utilisation de la valeur par défaut) conduit au même résultat

    ÉDIT 2: le return n'est apparemment pas en cause

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> 1, 2 if False == False else 1
    (1, 2)
    >>> 1, 2 if False == True else 1
    (1, 1)
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Qu'est ce qui est "anormal"?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Anormal, sans doute pas (je suis plutôt dans la mouvance, minoritaire, "c'est l'interpréteur qui a raison et moi je ne sais pas ou m'y prends comme un manche"), mais je m'attendais quand j'appelle fonction :
    • avec Z à True, à récupérer 2 listes
    • avec Z à False (soit spécifié, soit par défaut), à n'en recevoir qu'une seule
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    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
    Ben, la virgule a une priorité supérieure au if*!

    (foo, bar) if baz else foo devrait marcher comme attendu.

    EDIT: Pour être un peu plus technique, “if - else” est un des “opérateurs” de plus basse priorité (cf. la doc Python), seul lambda est en-dessous. Alors que la virgule hors de tout tuple, liste, dict etc. définit une “liste d’expressions”, elle a donc (virtuellement, car ce n’est pas vraiment un opérateur) la priorité la plus élevée (c’est un séparateur d’expression, un peu l’équivalent [avec beaucoup de pincettes*!] du “;” de C).

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par plxpy Voir le message
    mais je m'attendais quand j'appelle fonction :
    • avec Z à True, à récupérer 2 listes
    • avec Z à False (soit spécifié, soit par défaut), à n'en recevoir qu'une seule
    Comme vous montriez que les id identiques, je ne voyais pas trop ce que vous attendiez comme retour a la fonction.
    La solution de mont29 fonctionne.

    Citation Envoyé par mont29 Voir le message
    Ben, la virgule a une priorité supérieure au if*!
    Certes!
    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              return xy_list, z_list if Z else xy_list
    "xy_list, z_list if Z else xy_list" est un tuple a 2 éléments.
    L’écrire "(xy_list, z_list if Z else xy_list)" n'est pas interdit et serait peut être plus clair.
    "," n’est pas un "opérateur". Comment le comparer avec "if - else" ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    bougre d'âne que je suis !

    J'ai écrit et compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return xy_list, z_list if Z else xy_list
    alors qu'avec les précédences des opérateurs, il faut comprendre (et c'est)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return xy_list, z_list if Z else xy_list
    En C j'aurais fait gaffe, mais, là, en Python, ça m'est complétement passé au dessus de la tête !

    Merci mont29 et wiztricks

    (ça m'apprendra à ne pas mettre les parenthèses apparemment inutiles ...)
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

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

Discussions similaires

  1. une manipulation de Form que je ne sais pas faire
    Par JeanNoel53 dans le forum C++Builder
    Réponses: 6
    Dernier message: 07/02/2011, 14h19
  2. comportement que je ne comprend pas
    Par etienne.clopeau dans le forum Général Python
    Réponses: 15
    Dernier message: 17/07/2010, 23h37
  3. Réponses: 3
    Dernier message: 18/01/2010, 13h48
  4. [AIX] Message d'erreur que je ne sais pas tracer
    Par hallucinogenetique dans le forum AIX
    Réponses: 3
    Dernier message: 21/11/2007, 18h19
  5. Réponses: 2
    Dernier message: 31/05/2006, 15h13

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