不理解将元组作为参数传递

时间:2016-10-28 03:02:34

标签: python

我真的很难绕过这一个。我想我必须缺少几个概念,因为它有效,我只是感到困惑。

我知道我正在使用初始化程序和两个方法创建一个类。在初始化程序中,我设置了两个实例属性(_queue和_index)。前导下划线表示它们是实施细节。

我可以看到'推动'定义的方法有三个参数。第一个是调用该方法的对象(也就是实例)。第二个是两个变量。

我看到heapq.heappush()有两个参数: Arg1 - self._queue - 基本上是在初始化程序中创建的列表 Arg2 - 元组

Arg2是什么让我感动。我们如何接受具有3个元素的元组?我在heapq.heappush()文档中没有看到任何内容,表明我们能够做到这一点。它只是说你输入了你要附加的内容,然后是你要添加的内容。而且我没有看到进一步解析元组的东西,使其成为我认为应该采取的一个论点。当我尝试将这样的元组传递到普通python窗口中的heapq.heappush()时,它会失败。

有人可以帮助像我这样的新手了解我似乎缺少的任何概念吗?

非常感谢!

import  heapq
class PriorityQueue :
    def  __init__ (self):
        self._queue  =  [] 
        self._index  =  0 
    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index  +=  1 #add one to the index
    def pop( self ):
        return heapq.heappop(self._queue )[- 1 ]


class Item:
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return 'Item({!r})'.format(self.name)

1 个答案:

答案 0 :(得分:0)

让我们退一步思考python编译程序时会发生什么。当python看到

(-priority, self._index, item)

它将其编译为字节代码,查找这三个数据并创建一个tuple来保存它们。要查看,您可以添加一行print(type((-priority, self._index, item)))来显示其单个对象。

现在转到完整陈述

heapq.heappush(self._queue, (-priority, self._index, item))

在python创建该元组之后,它将它用作方法调用中的第二项。因此,当heappush看到它时,它是所需的单个项目。通常,python可以计算函数调用中的任何表达式,并使用构造的对象作为参数。它完全等同于以下代码,除了它不必经过中间变量

_stuff = (-priority, self._index, item)
heapq.heappush(self._queue, _stuff)
del _stuff

它可能令人困惑,因为parens用于制作元组和定义函数。不同之处在于它们在不同的地方使用(这是您需要def关键字的原因之一),因此python知道在每种情况下该做什么。