【问题标题】:Python default values for class member function parameters set to member variables设置为成员变量的类成员函数参数的 Python 默认值
【发布时间】:2013-05-24 15:26:35
【问题描述】:

我在 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!)。问题是,如果我把线 头 = self.head 在函数体内,它会在每次递归调用期间被调用,这绝对不是我需要的行为。 None 也是 head 变量的有效值,因此我不能将其作为默认值传递。我使用 -1 基本上知道我在初始函数调用而不是递归调用。我意识到我可以编写两个函数,一个驱动另一个,但我宁愿将它们全部包含在一个递归函数中。我很确定我在这里遗漏了一些基本的pythonic原则,有人可以帮助我解决问题的pythonic方法吗?

谢谢!

【问题讨论】:

  • 请更正显示函数的缩进。

标签: python variables


【解决方案1】:

我真的不明白你的代码有什么问题。如果您为 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.

【讨论】:

  • 我试图这样写:def display(self,head=self.head),这应该被允许吗?我的翻译抱怨它不知道“自我”是什么意思(有点哲学困境:))
  • @user2418063 不,这不可能,这就是我不谈论它的原因。这是不可能的,因为默认值是在类创建时评估的,而不是函数调用时。
  • 函数参数的默认值在函数第一次被解释并转换为函数对象时被解析和固定。那时,self 不存在,而且它也不是你想要的动态值。 self 只是约定用来接收绑定成员方法的隐式第一个参数的名称,它没有内在的特殊含义,并且不存在于定义它的范围之外,即它所在的方法内部一个论点。
  • 好的,我采用了 kwargs 方法,只需要对代码进行另一项更改。在我调用 self.display(head.link) 的地方,我需要将其更改为:self.display(head=head.link)。我认为第一种方法行不通,因为 None 是一个有效值,因此评估会在终止情况下导致无限循环。谢谢!
  • 使用关键字参数的完美例子!
猜你喜欢
  • 2015-01-15
  • 2021-12-29
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多