Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Linked List - Fatal编程技术网

Python 链表方法与函数

Python 链表方法与函数,python,oop,linked-list,Python,Oop,Linked List,我试图理解为什么一个函数可以作为一个外部函数工作,但是如果我将它作为一个方法移入类中,它就不工作了 我很快创建了一个链表类: class Link: """A linked list.""" empty = () def __init__(self, first, rest=empty): assert rest is Link.empty or isinstance(rest, Link) self.first = first

我试图理解为什么一个函数可以作为一个外部函数工作,但是如果我将它作为一个方法移入类中,它就不工作了

我很快创建了一个链表类:

class Link:
    """A linked list."""
    empty = ()

    def __init__(self, first, rest=empty):
        assert rest is Link.empty or isinstance(rest, Link)
        self.first = first
        self.rest = rest

    def __str__(self):
        string = '<'
        while self.rest is not Link.empty:
            string += str(self.first) + ', '
            self = self.rest
        return string + str(self.first) + '>'
它奏效了:

a = Link(3, Link(4, Link(5, Link(6))))
print(a)  # >>> <3, 4, 5, 6>
stretch(a)
print(a)  # >>> <3, 4, 4, 5, 5, 5, 6, 6, 6, 6>
现在它不起作用了:

b = Link(3, Link(4, Link(5, Link(6))))
b.stretch()
print(b)
# >>> AttributeError: 'tuple' object has no attribute 'stretch'
我知道当
b
到达最后一个元素时,
b.rest
将是一个空元组,但是在方法中,如果self不是Link,它会说
。empty
它不应该执行任何操作。为什么它会给我错误信息


谢谢

问题发生在线路上
self.rest.stretch(重复+1)
。由于没有在
链接(3,链接(4,链接(5,链接(6))
中将第二个参数传递给构造函数,因此
()
的默认值用于初始化字段
self.rest
,并且该字段的值此后不会更改。因此,
self.rest.stretch(repeat+1)
实际上是
().stretch(repeat+1)
。当然,
()
,一个空元组,没有属性
stretch


第一个函数可以工作,因为它没有令人不快的语句

问题发生在线路上
self.rest.stretch(重复+1)
。由于没有在
链接(3,链接(4,链接(5,链接(6))
中将第二个参数传递给构造函数,因此
()
的默认值用于初始化字段
self.rest
,并且该字段的值此后不会更改。因此,
self.rest.stretch(repeat+1)
实际上是
().stretch(repeat+1)
。当然,
()
,一个空元组,没有属性
stretch


第一个函数可以工作,因为它没有令人不快的语句

无论传递给
stretch
s
Link
对象还是
Link.empty
,第一个函数都有效

当对象为
Link.empty
时,第二个成员函数不起作用,因为
Link.empty
是一个没有方法的元组。您甚至从未将它加入到您的
if
将捕获它的函数中


在调用之前,您需要将
if
移动到外部。

无论传递给
stretch
s
链接对象还是
链接.empty
,第一个函数都起作用

当对象为
Link.empty
时,第二个成员函数不起作用,因为
Link.empty
是一个没有方法的元组。您甚至从未将它加入到您的
if
将捕获它的函数中


你需要在通话前将
if
移到外面。

你在课堂上定义了第二个
拉伸吗?@DYZ我当然定义了。问问你自己:
self
,它是
链接的一个实例,曾经
链接。空的
,哪个不是
链接的实例
?你在课堂上定义了第二个
链接
了吗?@DYZ我当然定义了。问问你自己:
self
,它是
链接
的实例,曾经是
链接。empty
,它不是
链接
的实例?我理解它为什么会变成
()。stretch(n)
。但是在这个方法中,不是有一个
if
条件来帮助防止在self.rest.stretch的后面部分执行空元组吗?那么我应该如何将这个函数写入类中呢?它不是关于
self
,而是关于
self.rest
。你从来没有检查过自己。rest
为空。作为旁注,您应该使用
None
而不是空元组。我理解为什么要使用
()。stretch(n)
。但是在这个方法中,不是有一个
if
条件来帮助防止在self.rest.stretch的后面部分执行空元组吗?那么我应该如何将这个函数写入类中呢?它不是关于
self
,而是关于
self.rest
。你从来没有检查过自己。rest
为空。作为旁注,您应该使用
None
而不是空元组。我明白了。这是有意义的,因为
拉伸
现在在
类链接中
,所以元组不会找到这个方法,不管我给出了什么
if
条件。非常感谢@代码\控制\ jxie0755我只是补充了一点解释。我明白了。这是有意义的,因为
拉伸
现在在
类链接中
,所以元组不会找到这个方法,不管我给出了什么
if
条件。非常感谢@代码\控制\ jxie0755我只是补充了一点解释。
def stretch(self, repeat=0):
    """Replicate the kth element k times, for all k in a linked list."""
    if self is not Link.empty:
        self.rest.stretch(repeat+1)
        for i in range(repeat):
            self.rest = Link(self.first, self.rest) 
b = Link(3, Link(4, Link(5, Link(6))))
b.stretch()
print(b)
# >>> AttributeError: 'tuple' object has no attribute 'stretch'