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 :

Affectation de variable


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Affectation de variable
    Bonjour,

    Entre :
    &
    Quelle affectation est la plus optimale?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 746
    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 746
    Par défaut
    Salut,

    Citation Envoyé par MissLoop Voir le message
    Quelle affectation est la plus optimale?
    Quand vous écrivez a = machin, l'assignation/affectation de l'objet machin à a n'a aucune raison de dépendre de la nature de l'objet machin.

    Par contre la différence entre [0, 0], liste sous forme littérale contenant deux zéros, et [0]*2 qui fabrique une liste semblable à partir d'une liste réduite à 1 seul zéro saute au yeux: il suffit de regarder les opérations effectuées.

    L'affectation coûte la même chose, la création/construction de l'objet à assigner, c'est autre chose. Ici, s'il y a une différence, elle sera "epsilonnesque" et n'aura d'importance que si l'opération sera répétée plusieurs millions de fois.

    Maintenant, vous vous rendez aussi compte que fabriquer une liste à N éléments nuls sera possible avec [0]*N alors que sans connaitre N, impossible d'écrire çà sous forme littérale.

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

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Notez que l'affectation
    est très dangereuse (et souvent ce n'est pas ce qu'on veut) si A n'est pas 0 comme dans votre exemple, mais plutôt un objet, ou plus généralement un mutable (une liste par exemple). Dans ces cas là, si on ne connait pas N à l'avance on devra instancier comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [A for _ in range(N)]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 746
    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 746
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    si A n'est pas 0 comme dans votre exemple, mais plutôt un objet, ou plus généralement un mutable (une liste par exemple). Dans ces cas là, si on ne connait pas N à l'avance on devra instancier comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [A for _ in range(N)]
    suivit de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [ A for _ in range(N)]
    produira le même résultat que:
    car j'assigne dans les 2 cas N fois la référence au même objet A.

    Et çà n'a rien à voir avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [ [] for _ in range(N)]
    est identique à
    dans le premier cas, je crée un objet liste vide [] à chaque itération alors que dans le 2nd je le recopie N fois.
    Subtil?

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

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Effectivement, j'ai écrit comme cela (avec A) pour avoir une écriture plus compact, mais ca peut prêter à confusion.
    Donc pour être clair, oui, dans ce que j'ai écrit il faut bien comprendre (pour l'exemple disons que A vaut [1,2,3]):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [ [1,2,3] for _ in range(N)]
    .vs.
    (qui produisent des résultats différents)

    et non pas

    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [ A for _ in range(N)]
    .vs.
    qui là en effet produisent la même chose.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Donc si je récapitule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tt = [0,1]
    n =2
    a = [tt for _ in range(n)]
    b = [tt] * n
    IDEM : À a & b est assignées 2 fois la référence de tt, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [[0, 1], [0, 1]]
    [[0, 1], [0, 1]]
    Pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c = [[0,1] for _ in range(n)]
    d = [[0,1]] * n
    IDENTIQUE : c est construit par la référence de tt à chaque itération alors que la référence de tt est copié dans d 2 fois, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [[0, 1], [0, 1]]
    [[0, 1], [0, 1]]
    Même procédé que pour c & d mais avec un résultat différent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    e = [[tt] for _ in range(n)]
    f = [[tt]] * n
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [[[0, 1]], [[0, 1]]]
    [[[0, 1]], [[0, 1]]]
    Ai-je bien compris?

Discussions similaires

  1. Problème d'affectation de variable
    Par bob33 dans le forum C
    Réponses: 3
    Dernier message: 04/11/2005, 17h01
  2. Affecter une variable javascript à une variable php
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 20h58
  3. affecter une variable de type stringstream
    Par sorari dans le forum SL & STL
    Réponses: 3
    Dernier message: 24/03/2005, 11h14
  4. [PS] affectation de variable
    Par madmortal dans le forum SQL
    Réponses: 2
    Dernier message: 01/09/2004, 13h17
  5. script SQL : affectation de variables
    Par Laura dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/10/2003, 21h32

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