gpt4 book ai didi

python - 为什么当将元组元素放入 Queue.PriorityQueue 时,元组元素的 __cmp__ 用于元组本身?

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:36 26 4
gpt4 key购买 nike

如果我在 python 2.7.10 中这样做

import Queue

class Item(object):
def __init__(self):
self.name = "bla"

def __cmp__(a, b):
return cmp(a.name, b.name)

e_queue = Queue.PriorityQueue()
e_queue.put((1,2))
item = Item()
e_queue.put((1, item))

第二个 put 失败并显示

...
File "/usr/lib/python2.7/Queue.py", line 136, in put
self._put(item)
File "/usr/lib/python2.7/Queue.py", line 225, in _put
heappush(self.queue, item)
File "tuple_nonsense.py", line 10, in __cmp__
return cmp(a.name, b.name)

显然,Item__cmp__ 应用于包含它的 tupleThe Queue docs甚至建议使用元组作为项目:

A typical pattern for entries is a tuple in the form: (priority_number, data).)

那么,这里的问题是什么?

最佳答案

在Python中,when you compare sequences, the elements in them are compared on by one 。因此,当比较元组 (1, 2)(1, item) 时,第一个元素是相同的。因此,比较第二个元素以确定哪个较小。由于您有 2item,并且 item 已实现 __cmp__,因此它会调用该函数。

您可以使用简单的 print 语句来确认这一点,如下所示

class Item(object):

def __init__(self):
self.name = "bla"

def __cmp__(a, b):
print a, b
return cmp(a.name, b.name)

此处,a 将是 item 对象,b 将是 2。由于 2 没有 name 属性,因此失败并显示

AttributeError: 'int' object has no attribute 'name'

关于python - 为什么当将元组元素放入 Queue.PriorityQueue 时,元组元素的 __cmp__ 用于元组本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34793027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com