Python:默认比较

Python:默认比较,python,object,comparison,Python,Object,Comparison,在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>, ...

在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 at”旁边的十六进制数?这是一个指针引用。它可以大致等同于创建顺序。如果遍历该列表,您将看到它已使用该列表作为标准对对象进行了排序


作为旁注,我记得我被Python2.x比较。。。但我不知道这个问题是否在Py3k中得到了解决。

我不太确定,但也许有人可以纠正我的错误


当你比较对象时,它会比较它们的内存地址,想象一下比较C中的两个cstring。如果你看一下,排序会将对象从最低的内存地址排序到最高的内存地址(或指针位置).

我认为唯一的理由是,可以方便地对对象进行排序,例如使用一些默认行为作为字典键。语言定义中的相关章节如下:

“一个对象比另一个对象小还是大的选择是任意的,但在程序的一次执行中是一致的。”
因此,当前使用内存地址比较对象的事实只是一个无法依赖的实现细节。唯一的保证是在执行过程中顺序保持一致。

是的,我注意到了这一点。但是理由是什么呢?@aix查看编辑。Python<3使得比较几乎变得非常容易。python中的变量是对堆中对象的引用。按内存地址排序可能是python开发人员能够想到的最容易实现默认行为的方法。的确,但这似乎有点武断,因此不太符合python?在底层C代码中,当比较2对象时,它只是比较2整数,它指向对象存储的内存,我们都知道整数比较是如何工作的。(+1)对于链接和引用。+1,你的评论完全正确。我被两个对象的相等和其他比较运算符误导了,谢谢你找出我的错误
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__']