Python:默认比较

NPE*_*NPE 9 python comparison object

在Python 2.7中,我定义了一个空的新式类:

In [43]: class C(object): pass
   ....:
Run Code Online (Sandbox Code Playgroud)

然后创建新类的实例列表:

In [44]: c = [C() for i in xrange(10)]
Run Code Online (Sandbox Code Playgroud)

然后尝试对列表进行排序:

In [45]: sorted(c)
Out[45]:
[<__main__.C object at 0x1950a490>,
 <__main__.C object at 0x1950a4d0>,
 ...
 <__main__.C object at 0x1950aad0>]
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,排序并没有抱怨,即使我没有定义比较实例的方法C:

In [46]: dir(C())
Out[46]:
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
Run Code Online (Sandbox Code Playgroud)

到底发生了什么,以及这个 - 可以说是令人惊讶的 - 行为的理由是什么?

sha*_*ang 15

我认为唯一的基本原理是方便对象可以进行排序,例如用作具有某些默认行为的字典键.语言定义的相关章节如下:https://docs.python.org/2/reference/expressions.html#not-in

"选择一个对象是否比另一个对象更小或更大的选择是在程序的一次执行中任意但一致的."

因此,目前使用内存地址比较对象这一事实只是一个无法计算的实现细节.唯一的保证是订单在执行期间保持一致.