在python中定义a=b=class_name(value1) b=class_name(value2)后两个值相同和不同

Two values are same and different after defining a=b=class_name(value1) b=class_name(value2) in python

在下面的代码中,我了解到tree(代码中命名)和parent(代码中命名)的打印应该是不一样的。但是我不明白,为什么tree总是根据parent的更新而更新? (本题延续上一题

代码:

class node(object):
    def __init__(self, value):
        self.value = value
        self.children = []
    def __repr__(self, level=0):
        ret = "\t"*level+repr(self.value)+"\n"
        for child in self.children:
            ret += child.__repr__(level+1)
        return ret
    def add(self, nod):
        self.children.append(nod)
list_0 = ['AA', 'BB', 'CC', 'DD']
tree = parent = node(list_0[0])
i=1
while i<len(list_0):
    current_node = node(list_0[i])
    parent.add(current_node)
    parent = current_node
    i+=1
print(tree)
print(parent)

输出:

'AA'
    'BB'
        'CC'
            'DD'

'DD'

在代码中,很明显在循环中每次都会重新初始化parent,但是根据我的理解,在parent更新的同时,tree 不应相应更新。因为一旦 parent 在循环中重新初始化,它就不再与 tree 具有相同的 id(可能是地址),那么 tree 将不会根据parent.

问题:

  1. 为什么tree每次循环都改了id(parent)还是按照parent更新?

  2. tree 如何链接到循环内的 parent?例如,node[1]node[2]。(更新)

感谢任何评论或解释,提前致谢!

我认为这是因为你的树总是指向根节点,但父节点指向下一个节点。

让我们定义一些术语:

  • 节点[0]:创建的第一个节点
  • 节点[1]:创建的第二个节点
  • ref(node[X]): 对节点X的引用
  • ref(node[0]) -> ref(node[1]):对节点 0 的引用,其子节点为节点 1

第 0 步

tree = parent = node(list_0[0])

tree is pointing to ref(node[0])

parent is pointing to ref(node[0])

第 1 步(在 while 循环内)

parent = current_node

tree still pointing to ref(node[0]) -> ref(node[1])

parent is pointing to ref(node[1])

第 n 步

tree still pointing to ref(node[0]) -> ref(node[1]) -> .... -> ref(node[n])

parent is pointing to ref(node[n])

更形象的解释方式:

# Step 0
tree, parent  ->  node[0]

# Step 1
tree   ->         node[0]
                    |
parent ->         node[1]

# Step 2
tree   ->         node[0]
                    |
                  node[1]
                    |
parent ->         node[2]

# Step n
tree   ->         node[0]
                    |
                  node[1]
                    |
                   ...
                    |
parent ->         node[n]

正在将一个节点添加为该行中另一个节点的子节点:

parent.add(current_node)

所以 tree 总是指向树的根元素,而 parent 指向树的最后一个元素。这就是 ID 不同的原因!

希望我为您提供了有用的信息!