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 :

id() concrètement ça fait quoi ? [Python 3.X]


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut id() concrètement ça fait quoi ?
    Bonjour

    Je me pose cette question: que fait concrètement id() ???

    Voici ce que dit la doc
    Citation Envoyé par python
    id(...)
    id(object) -> integer

    Return the identity of an object. This is guaranteed to be unique among
    simultaneously existing objects. (Hint: it's the object's memory address.)
    Donc là je ne me trompe pas. Je lis bien "c'est l'adresse mémoire de l'objet".

    Ensuite je fais quelques tests
    Code python : 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
    17
    18
    >>> a=5
    >>> id(a)
    10771648
    >>> a=6
    >>> id(a)
    10771680
    >>> a=5
    >>> id(a)
    10771648
    >>> b=a
    >>> id(b)
    10771648
    >>> id(5)
    10771648
    >>> id(6)
    10771680
    >>> id(a+1)
    10771680

    Donc là je ne comprends plus trop. Si vraiment id() donne l'adresse de la variable "a", le résutat ne devrait pas être fonction de son contenu. Et si "b" est une copie de "a", son adresse à elle devrait être différente. Et on ne peut pas demander l'adresse d'un nombre codé en dur. En tout cas, ce sont là des questions qui me turlupinent. Peut-être parce que j'essaye de faire le rapprochement avec le &a du C qui n'aurait pas du tout répondu la même chose avec des tests équivalents...

    Alors j'avais bien une hypothèse: je me disais que les valeurs en dur (5, 6) sont stockées dans la zone statique du code et que id() me renvoie l'adresse de cette zone. Cela aurait pu expliquer tous les différents résultats... à l'excepté du dernier (id(a+1)) car là c'est un calcul que je demande. Or l'adresse d'un calcul...???

    Donc si quelqu'un avait une explication...

    Merci à tous de votre attention.

  2. #2
    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
    Bonjour

    je pense que c'est l'adresse éphémère de l'entier tout aussi éphémère résultat de a+1

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    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 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Salut,

    Il faut commencer par se souvenir qu'avec Python, une variable est l'association entre une chaîne de caractère (a, b,...) et un objet.
    Et qui dit "association" pense "dictionnaire".
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = 5
    >>> globals()['a']
    5
    >>> globals()['b'] = a
    >>> b
    5
    Avec les entrées "a" et "b" du dictionnaire globals() associées au même objet 5 (qui est un "int" et non mutable). Pour l'instant, normal que l’identifiant de l'objet soit identique.

    Après on a un détail de l'implémentation de CPython (décrit ici) et qui permet à Python d'avoir en cache les entiers de -5 à 256

    Le fond étant que si j'associe le même entier à deux variables différentes, on aura l'égalité mais pas nécessairement des objets identiques. Pour les entiers précédents on a aussi des objets identiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a = 6
    >>> b = 5+1
    >>> id(a)
    8791589086000
    >>> id(b)
    8791589086000
    >>>
    Alors que si on sort de cet intervalle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = 1000
    >>> b = 1000
    >>> id (a)
    30455856
    >>> id(b)
    4474768
    C'est une optimisation qui existe aussi pour les chaines de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a = 'toto'
    >>> b = 'toto'
    >>> id(a)
    38273408
    >>> id(b)
    38273408
    >>>
    et qui est "acceptable" puisque ces objets là sont non mutables.

    - W

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et qui dit "association" pense "dictionnaire".
    Joli

    Citation Envoyé par wiztricks Voir le message
    Après on a un détail de l'implémentation de CPython (décrit ici) et qui permet à Python d'avoir en cache les entiers de -5 à 256
    Amusant. Bon, je conçois que cela ait pu fausser mes tests. Mais ça ressemblait presque à mon hypothèse à propose des valeurs stockées en zone statique
    Accessoirement je comprends bien la signification de 256 mais pour ce qui est de "-5" ça... ?

    Citation Envoyé par wiztricks Voir le message
    C'est une optimisation qui existe aussi pour les chaines de caractères et qui est "acceptable" puisque ces objets là sont non mutables.
    Oui oui, ça je savais donc c'est pour ça que je me suis cantonné aux valeurs simples.

    Bravo pour ton explication

    Merci à plxpy. Même si ton hypothèse ne m'avait pas vraiment convaincu et que j'attendais avec impatience voir la réponse de wiztricks, c'est toujours bon de voir quelqu'un s'intéresser à ses questions :

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    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 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Mais ça ressemblait presque à mon hypothèse à propose des valeurs stockées en zone statique
    C'est le cas du point de vue du programmeur C: ces objets existent dans un tableau pré-alloué. Mais vu du programmeur Python, a = 5 ne crée pas un nouvel objet peu importe la cuisine qu'il y a derrière.

    Citation Envoyé par Sve@r Voir le message
    Accessoirement je comprends bien la signification de 256 mais pour ce qui est de "-5" ça... ?
    Je n'ai peut être pas bien cherché mais je n'ai rien trouvé qui raconte pourquoi/comment ils en sont arrivé à ce choix.

    - W

  6. #6
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    On avait déjà un peu abordé le sujet, en dérivant d'un autre sujet il y a quelques mois :

    https://www.developpez.net/forums/d1...iables-python/

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    On avait déjà un peu abordé le sujet, en dérivant d'un autre sujet il y a quelques mois
    Oui, j'avais une vague réminiscence de ce topic mais je savais aussi que ça ne m'avait pas convaincu. Donc là j'ai reposé le problème bien proprement avec des tests bien construits (sauf que je ne savais pas que ces tests étaient faussé car inclus dans la plage [-5:256] )
    Depuis, j'ai refait de nouveaux tests avec des valeurs dépassant 256 et là id() répond des trucs qui sont plus en adéquation avec ce que j'imaginais au début.

    J'ai d'ailleurs remarqué un truc amusant: id(nbr) renvoie toujours la même chose quel que soit le nombre... jusqu'à ce qu'on modifie une variable existante ou qu'on en crée une nouvelle
    Code python : 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
    >>> a=500
    >>> id(a)
    140558318882736
    >>> id(1000)
    140558318931856
    >>> id(2000)
    140558318931856
    >>> id(3000)
    140558318931856
    >>> id(4000)
    140558318931856
    >>> a=500
    >>> id(a)
    140006045630352
    >>> id(4000)
    140558318882736
    Excellent non ? On remarque que la dernière valeur est celle qui contenait "a" à l'origine (qui se trouve maintenant ailleurs).

    Et si on continue avec une opération là les valeurs sont les mêmes mais de 2 en 2
    Code python : 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
    >>> id(4000)
    140444022550416
    >>> id(4000+1000)
    140444021958640
    >>> id(4000+1000)
    140444021958576
    >>> id(4000+1000)
    140444021958640
    >>> id(4000+1000)
    140444021958576
    >>> id(4000+1000)
    140444021958640
    >>> id(4000+1000)
    140444021958576
    >>> id(4000+1000)
    140444021958640

    Ca ressemble au comportement décrit par plxpy qui parle d'adresse éphémère...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    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 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Ca ressemble au comportement décrit par plxpy qui parle d'adresse éphémère...
    Relisez la documentation et essayez de comprendre que faire id(4000) ou id(5000+1000), c'est déjà un peu n'importe quoi vu ce qu'en raconte la documentation.

    - W

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

Discussions similaires

  1. Administrateur système-réseau : on y fait quoi?
    Par Nasky dans le forum Emploi
    Réponses: 12
    Dernier message: 19/04/2006, 09h59
  2. [Dll]qui fait quoi?
    Par clovis dans le forum C++Builder
    Réponses: 12
    Dernier message: 10/02/2006, 10h44
  3. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 12h23

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