Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

pourquoi : (id([1,2]) == id([1, 2, 3])) is True ?

0 votes

je n'arrive pas à comprendre les enchaînements de tests suivant :

id([]) == id([])
>>> True     # [] est définie en mémoire, donc je test 2 fois le même objet

id(list()) == id(list())
>>> False    # list() crée à chaque fois un objet, donc il s'agit bien de 2 objets différents en mémoire

id([1, 2]) == id([1, 2, 3])
>>> True     # ????

id([1, 2]) is id([1, 2, 3])
>>> False    # ????

au cas où:

  • Python 3.6.8 (default, Aug 20 2019, 17:12:48)
  • IPython 5.5.0
demandé 16-Sep par Lhassa (798 points)

Il n'y'aurait pas une histoire de garbage collector et d'adresse mémoire réutilisé ?

Oui c'est exactement ça.

1 Réponse

0 votes

Le même résultat avec python 3.7.4. De plus :

In [2]: a = id([1,2])
In [3]: b = id([1,2,3])
In [4]: a == b
Out[4]: False

La seule raison que je peux voir est dans la doc :
" Two objects with non-overlapping lifetimes may have the same id() value."

Dans ton cas : il renvoie la valeur mais ne la stocke pas => (non-overlapping), dans le deuxième les valeurs sont stockées (variable ou comparaison identitaire) => (overlapping).

Ton avis ?

répondu 17-Sep par pydidi (270 points)
edité 17-Sep par Lhassa

merci pour le retour. 2 liens pour illustrer ça :

et un bout de code pour mettre ça en évidence (même si j'ai pas encore tout compris, faut être honnête)

In [1]: def test(): return len(list(range(5))))

In [2]: test()
Out[2]: 5

In [10]: id([test()]) == id([5])
Out[10]: True

In [11]: id([5]) == id([test()])
Out[11]: False

la fonction test() force la création d'une list en mémoire, donc occupe l'espace mémoire laissée vide par [5], avant que [test()] (et donc en fait [5] à nouveau) ne soit évalué...

CQFD ?...

et parce que python c'est bô, et que je comprend pas tout...

help("is")

renvoie

Identity comparisons

The operators "is" and "is not" test for object identity: "x is y" is
true if and only if x and y are the same object. Object identity
is determined using the "id()" function. "x is not y" yields the
inverse truth value. [4]

In [28]: id([test()]) == id([5])
Out[28]: True

In [29]: id([5]) == id([test()])
Out[29]: False

et donc on peut remplacer la comparaison d'id() par un test is

In [30]: [test()] is [5]
Out[30]: False

In [31]: [5] is [test()]
Out[31]: False

ah ben non...

Excellent article sur S&M, merci. ;)

a=[1,2]
b=[1,2,3]
id(a)==id(b)
False

Plutôt.

...