```rst
collections.OrderedDict.values().__eq__
* "is suprising"
* Python 3 has `dict views`_
* :class:`OrderedDict` matches the dict interface in Python 2.7 and
Python 3.
* Python 2 dict interface:
* dict.viewkeys(), dict.viewvalues(), dict.viewitems()
* dict.keys(), dict.values(), dict.items()
* Python 3 dict interface (:ref:`dictionary view objects`:
* dict.keys(), dict.values(), dict.items()
* list(dict.keys()), list(dict.values()), list(dict.items())
* In order to compare OrderedDict.values() **by value**
you must either:
* Cast values() to a sequence (e.g. a list) before comparison
* Subclass :class:`OrderedDict` and wrap `values()`
.. code:: python
from collections import OrderedDict
a = 'a'
x = 1
y = x
ab = [( a, x), ('b', 2)]
ba = [('b', 2), (a, y)]
ab_odict = OrderedDict(ab)
ab_odict_ = OrderedDict(ab)
ab_odict_copy = OrderedDict(ab.copy())
ba_odict = OrderedDict(ba)
ab_dict = dict(ab)
ba_dict = dict(ba)
# In Python 3,
# OrderedDict.values.__eq__ does not compare by value:
assert ( ab_odict.values() == ab_odict_.values()) is False
assert (list(ab_odict.values()) == list(ab_odict_.values()) is True
# In Python 2.7 and 3,
# OrderedDict.__eq__ compares ordered sequences
assert (ab_odict == ab_odict_) is True
assert (ab_odict == ab_odict_copy) is True
assert (ab_odict == ba_odict) is False
assert (ab_dict == ba_dict) is True
# - [ ] How to explain the x, y part?
# - in terms of references, __eq__, id(obj), __hash__