54 votes

Pourquoi les valeurs d'un OrderedDict ne sont pas égales?

Avec Python 3:

>>> from collections import OrderedDict
>>> d1 = OrderedDict([('foo', 'bar')])
>>> d2 = OrderedDict([('foo', 'bar')])

Je veux vérifier l'égalité:

>>> d1 == d2
True
>>> d1.keys() == d2.keys()
True

Mais:

>>> d1.values() == d2.values()
False

Savez-vous pourquoi les valeurs ne sont pas égales?

Testé avec Python 3.4 et 3.5


Suite à cette question, j'ai posté sur le Python-Idées de liste de diffusion pour avoir plus de détails:

https://mail.python.org/pipermail/python-ideas/2015-December/037472.html

46voto

bruno desthuilliers Points 10061

En Python 3, dict.keys() et dict.values() retournent des classes spéciales itérables - respectivement a collections.abc.KeysView et a collections.abc.ValuesView . Le premier hérite de la méthode __eq__ de set , le second utilise la valeur par défaut object.__eq__ qui teste l'identité de l'objet.

21voto

bigOTHER Points 6303

En python3, d1.values() et d2.values() sont collections.abc.ValuesView objets:

>>> d1.values()
ValuesView(OrderedDict([('foo', 'bar')]))

Ne comparez pas comme un objet, c onvert à des listes et de les comparer:

>>> list(d1.values()) == list(d2.values())
True

Rechercher pourquoi il travaille pour comparer les clés, en _collections_abc.py de Disponible, KeysView hérite d' Set tout ValuesView n'est pas:

class KeysView(MappingView, Set):

class ValuesView(MappingView):
  • Le suivi pour __eq__ en ValuesView et de ses parents:

    MappingView ==> Sized ==> ABCMeta ==> type ==> object.

    __eq__ est mise en œuvre que dans object et n'est pas remplacée.

  • Dans l'autre main, KeysView hérite __eq__ directement à partir de Set.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X