Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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默认值_Python_Variables - Fatal编程技术网

设置为成员变量的类成员函数参数的Python默认值

设置为成员变量的类成员函数参数的Python默认值,python,variables,Python,Variables,我在用Python编写递归成员函数时遇到了一个问题。我无法将函数参数的默认值初始化为与成员变量相同的值。我猜Python不支持该功能,因为它说在我尝试分配参数时没有定义self。虽然我可以围绕它进行编码,但Python中缺少函数重载的特性使我想尝试的一个明显的解决方案落空 例如,尝试递归打印一个链表时,我得到了显示函数的以下代码 def display(self,head = -1): if head == -1: head = self.head

我在用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()
如果我可以将display函数参数设置为default为self.head,如果在没有参数的情况下调用它,那么它看起来会更好。我最初尝试创建两个版本的函数,一个接受两个参数,另一个接受一个参数,但正如我所说的,Python不支持重载。我可以传入一个参数列表并检查参数的数量,但这也会非常难看(这会使它看起来像Perl!)。问题是,如果我 头 在函数体内部,每次递归调用都会调用它,这绝对不是我需要的行为。None也是head变量的有效值,因此我无法将其作为默认值传入。我使用-1基本上知道我处于初始函数调用中,而不是递归调用中。我意识到我可以编写两个函数,一个驱动另一个,但我更希望所有函数都包含在一个递归函数中。我很确定我遗漏了一些基本的pythonic原理,有人能帮我解决这个问题吗


谢谢

我真的看不出你的代码有什么问题。如果您为
head
选择了一个错误的默认值,您可以这样做:
head=head或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)。我认为第一种方法行不通,因为没有一个是有效的值,所以求值将在终止情况下导致无限循环。谢谢使用关键字参数的完美例子!请更正显示函数的缩进。