通过其他节点引用的节点进行递归迭代

时间:2019-03-08 14:01:09

标签: python object object-reference

如何参考上一个节点递归地遍历节点?在下面的示例中,预期输出为4,3,2,1:

class Node:
    def __init__(self, parent, value):
        self.parent = parent
        self.value = value

    def append(self, value):
        return Node(self, value)

def list(l):
    print(l.value)
    while l.parent is not None:
        list(l.parent)

l = Node(None, 1)
l = l.append(2)
l = l.append(3)
l = l.append(4)
list(l)

2 个答案:

答案 0 :(得分:2)

您的类结构已成功将节点的self值传递到其子节点。问题是您的list函数。 while l.parent is not None:永无止境,因为循环中没有任何更改l的值。递归调用list将创建一个新的上下文,其中另一个名为l的变量的值与第一个上下文的l不同,但这对第一个l或第一个循环。递归函数通常不需要实际循环即可迭代数据结构的元素。试试:

def list(l):
    print(l.value)
    if l.parent is not None:
        list(l.parent)

或者:

def list(l):
    while l is not None:
        print(l.value)
        l = l.parent

(我建议使用后者,因为如果链中有999个以上的元素,第一个将崩溃并显示“超过最大递归深度”)

结果:

4
3
2
1

奖金样式提示:考虑为函数命名而不是list。通常,应避免覆盖内置函数和类型的名称。

答案 1 :(得分:0)

由于缺乏明确的问题陈述,我应该投票结束您的问题,但是无论如何...

  

在Python中的对象中,如何传递当前对象的引用

与处理任何对象相同的方式。

  

针对相同类别的对象b

这实际上无关紧要,但是无论如何...

  

这样当我打电话给b.parent时,我可以回到对象a?

class Foo(object):
    def __init__(self, parent=None):
        self.parent = parent

a = Foo()
b = Foo(a)
print(b.parent is a)

现在要回答您未曾提出的问题,请参阅(并接受)凯文的回答;-)