4

我在 Python 中编写递归成员函数时遇到问题。我无法将函数参数的默认值初始化为与成员变量相同的值。我猜 Python 不支持该功能,因为它说在我尝试分配参数时未定义 self 。虽然我可以围绕它编写代码,但 Python 中缺少函数重载会导致我尝试一种明显的解决方案。

例如,尝试递归打印一个链表,我的显示函数得到以下代码;

    def display(self,head = -1):
       if head == -1:
          head = self.head 

       if not head:
          return

       print head,

       self.display(head.link)

虽然这段代码有效,但它很丑陋。主函数如下所示:

def main():
    l = List();
    l.insert(3);
    l.insert(40);
    l.insert(43);
    l.insert(45);
    l.insert(65);
    l.insert(76);

    l.display()

if __name__ == "__main__":
    main()

如果我可以将显示函数参数设置为默认为 self.head 如果它在没有参数的情况下调用,那么它看起来会更好。我最初尝试创建该函数的两个版本,一个带有两个参数,一个带有一个,但正如我所说,Python 不支持重载。我可以传入一个参数列表并检查参数的数量,但这也很丑陋(它会使它看起来像 Perl!)。问题是,如果我将 head = self.head 这行放在函数体内,它会在每次递归调用期间被调用,这绝对不是我需要的行为。None 也是 head 变量的有效值,因此我不能将其作为默认值传递。我使用 -1 基本上知道我在初始函数调用而不是递归调用。我意识到我可以写两个函数,一个驱动另一个,但我宁愿将它全部包含在一个递归函数中。我很确定我在这里遗漏了一些基本的pythonic原则,有人可以帮助我解决问题的pythonic方法吗?

谢谢!

4

1 回答 1

3

我真的不明白你的代码有什么问题。如果你为 选择了一个虚假的默认值head,你可以这样做:head = head or self.head更简洁。

否则,这几乎是您处理默认参数所必须做的。或者,使用kwargs

def display(self,**kwargs):
    head = kwargs.get("head", self.head)

    if not head:
        return

    print head,

    self.display(head=head.link) # you should always name an optional argument,
                                 # and you must name it if **kwargs is used.
于 2013-05-24T15:35:32.403 回答