Air*_*Air 5 python comparison python-2.7
我才发现,原来这是法律在Python中比较使用运营商的任意功能>,<,>=和<=.这看起来有点傻; 我一半期望这样的比较总是False(或抛出异常),但文档说:"内置类型的大多数其他对象比较不相等,除非它们是同一个对象;选择是否一个对象被认为是小于或大于另一个是在一个程序的执行中任意但一致的."
所以我做了一些小试验,这意味着可能在这里定义函数的顺序很重要:
>>> def g():
pass
>>> def y():
pass
>>> g > y
False
>>> y > g
True
>>> def r():
pass
>>> g > r
False
>>> r > g
True
>>> y > r
False
>>> r > y
True
>>> def barfoo():
pass
>>> barfoo > r > y > g
True
Run Code Online (Sandbox Code Playgroud)
我试着追查源代码(在这里注意到我现在已经超出了我的深度,拥有了两个月的C经验).这个答案让我想到了Python/ceval.c,它似乎使用PyObject_RichCompare()(第4640行)来处理这些比较运算符.我找不到该功能的定义,只找到一个PEP,那就是我被卡住的地方.
我怎么能预测这些看似荒谬的操作的结果呢?(只要我们在这里......我为什么要这样做?)
奖金:
>>> unicode > super > object > type > tuple > str > basestring > slice > frozenset > set > xrange > memoryview > long > list > int > staticmethod > classmethod > float > file > reversed > enumerate > dict > property > complex > bytearray > buffer > bool > zip > vars > unichr > sum > sorted > setattr > round > repr > reload > reduce > raw_input > range > pow > ord > open > oct > next > min > max > map > locals > len > iter > issubclass > isinstance > intern > input > id > hex > hash > hasattr > globals > getattr > format > filter > execfile > eval > divmod > dir > delattr > compile > coerce > cmp > chr > callable > bin > apply > any > all > abs > __import__ > help
True
Run Code Online (Sandbox Code Playgroud)
在 python2 中,这些类型的比较是根据id()对象的值完成的:
In [1]: def g():
...: pass
In [2]: def y():
...: pass
In [3]: g > y
Out[3]: True
In [4]: id(g)
Out[4]: 55898312
In [5]: id(y)
Out[5]: 54420736
Run Code Online (Sandbox Code Playgroud)
的值id()通常取决于函数对象的内存地址,这可能取决于任意事物,例如垃圾收集器的先前历史记录。可能正是因为这个原因,Python 的开发人员删除了这个功能,所以现在比较 Python3 中的函数会出现错误:
In [3]: g > y
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/xxx/<ipython-input-3-9ebc8ff65838> in <module>()
----> 1 g > y
TypeError: unorderable types: function() > function()
Run Code Online (Sandbox Code Playgroud)
在 python 3 中,相等比较仍然合法,因为它不依赖于 的任意值id():
In [4]: g == y
Out[4]: False
In [5]: g != y
Out[5]: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |