如何解决在python中定义a=b=class_name(value1) b=class_name(value2)后两个值相同和不同
在下面的代码中,我理解tree
(在代码中命名)和parent
(在代码中命名)的打印应该是不一样的。但是我不明白,为什么tree
总是按照parent
的更新而更新?
(这个问题延续上一个问题here)
代码:
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
。
问题:
-
为什么
tree
仍然根据parent
更新,即使id(parent)
在循环中每次都改变? -
tree
如何链接到循环内的parent
?例如,node[1]
、node[2]
.(update)
感谢任何评论或解释,提前致谢!
解决方法
我认为这是因为你的树总是指向根节点,而父节点指向下一个节点。
让我们定义一些命名法:
- node[0]:创建的第一个节点
- node[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)
所以树总是指向树的根元素,而父元素指向树的最后一个元素。这就是id不同的原因!
希望我为您提供了有用的信息!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。