一尘不染

Python:默认比较

python

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

In [43]: class C(object): pass
   ....:

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

In [44]: c = [C() for i in xrange(10)]

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

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

令人惊讶的是,即使我还没有定义一种比较以下实例的方法,该类也不会抱怨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__']

那里到底发生了 什么?这种行为的理由是什么(可能令人惊讶)?


阅读 153

收藏
2021-01-20

共1个答案

一尘不染

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

“一个对象被认为是小于还是大于另一个对象的选择是任意的,但是始终在程序的一次执行中进行。”

因此,当前使用内存地址比较对象的事实只是无法依靠的实现细节。唯一的保证是在执行过程中顺序保持一致。

2021-01-20