Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在2.7和3.x版本中,heapq推送比较是如何工作的_Python_Python 2.7_Python 3.x_Heap - Fatal编程技术网

Python 在2.7和3.x版本中,heapq推送比较是如何工作的

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至少使用了,所以我知道。。。我想

这在Python2.7中有效,但在3.x中无效。如文件中所述

在未来的Python 3中,如果优先级相等且任务没有默认的比较顺序,则(优先级,任务)对的元组比较会中断


在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)