在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
.
问题:
为什么tree
每次循环都改了id(parent)
还是按照parent
更新?
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 不同的原因!
希望我为您提供了有用的信息!
在下面的代码中,我了解到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
.
问题:
为什么
tree
每次循环都改了id(parent)
还是按照parent
更新?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 不同的原因!
希望我为您提供了有用的信息!