链表方法与函数



我试图理解为什么一个函数可以作为外部函数工作,但如果我把它作为方法移到类中,它就不会工作。

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

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) + '>'

所以当我试图创建一个名为stretch的函数时,我可以:

def stretch(s, repeat=0):
"""Replicate the kth element k times, for all k in s."""
if s is not Link.empty:
stretch(s.rest, repeat+1)
for i in range(repeat):
s.rest = Link(s.first, s.rest)

成功了:

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>

然而,当我尝试将此函数创建为类方法时:

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'

我知道当b到达最后一个元素时,b.rest将是一个空元组,但在方法中,它表示if self is not Link.empty不应该执行任何内容。为什么它会给我错误信息?

谢谢!

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

第一个函数之所以有效,是因为它没有违规语句。

第一个函数适用于传递给stretchsLink对象还是Link.empty

当对象为Link.empty时,第二个成员函数不起作用,因为Link.empty是一个没有方法的元组。你甚至从来没有把它变成if会捕捉到它的函数

在呼叫之前,您需要将if移到室外。

相关内容

  • 没有找到相关文章

最新更新