Python 在2.7和3.x版本中,heapq推送比较是如何工作的
这在Python2.7中有效,但在3.x中无效。如文件中所述 在未来的Python 3中,如果优先级相等且任务没有默认的比较顺序,则(优先级,任务)对的元组比较会中断Python 在2.7和3.x版本中,heapq推送比较是如何工作的,python,python-2.7,python-3.x,heap,Python,Python 2.7,Python 3.x,Heap,这在Python2.7中有效,但在3.x中无效。如文件中所述 在未来的Python 3中,如果优先级相等且任务没有默认的比较顺序,则(优先级,任务)对的元组比较会中断 在2.7的heapq.heappush中如何处理不可比较的对象?假设您希望通过它们的.x值来比较Foo实例。您的代码可以在2.x中运行,但它不会以任何合理的方式工作,因为Foo instancex将由它们的id进行比较。Python3通过不使用无用的默认值来保护您免受此类无声bug的影响。heapq至少使用了,所以我知道。。。我想
在2.7的
heapq.heappush
中如何处理不可比较的对象?假设您希望通过它们的.x值来比较Foo实例。您的代码可以在2.x中运行,但它不会以任何合理的方式工作,因为Foo instancex将由它们的id进行比较。Python3通过不使用无用的默认值来保护您免受此类无声bug的影响。heapq至少使用了,所以我知道。。。我想知道“在2.7的heapq.heappush
中,不可比较的对象是如何处理的?”这两个对象是否被看似随机的东西(比如它们的散列)进行了比较?或者他们只是在添加到末尾时没有筛选堆?或者别的什么?在2.x中,几乎所有对象都可以与CPython的默认比较进行“比较”,我相信,CPython的默认比较是按类名然后按id进行的。其思想是list.sort()应该始终有效,即使顺序是任意的。当复数和Guido决定遵循数学约定,即复数之间不按顺序排列,更不用说与其他事物进行比较时,这条规则被打破了。我只是尝试用同一类的两个实例对列表进行重排序,id较高的一个放在列表的开头。一定是别的东西,或者是id的函数。
import heapq
class Foo(object):
def __init__(self, x):
self._x = x
l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))
import heapq
class Foo(object):
def __init__(self, x):
self._x = x
def __repr__(self):
return 'Foo(%s)' % self._x
def __lt__(self, other):
return self._x < other._x
l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))
print(l)