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'