Bienvenue sur IndexError.

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

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-2019 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-2019 par pydidi (270 points)
edité 17-Sep-2019 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.

...