Python中图的节点
我正在试图找出编码节点类(将在二叉树中使用)的最佳方法,该节点类将包含属性Python中图的节点,python,class,Python,Class,我正在试图找出编码节点类(将在二叉树中使用)的最佳方法,该节点类将包含属性key、left和right 我想我会做类似的事情 class Node: def __init__(self, key): self.key= key self.left = None self.right = None 然后呢 a = Node('A') b = Node('B') c = Node('C') a.left = b a.right = c
key
、left
和right
我想我会做类似的事情
class Node:
def __init__(self, key):
self.key= key
self.left = None
self.right = None
然后呢
a = Node('A')
b = Node('B')
c = Node('C')
a.left = b
a.right = c
在这里我有点困惑:是(在引擎盖下)左
还是右
指针?或者a
是否包含整个树的副本
如果我加上
d = Node('B') # same key as before, but an entirely different node
c.right = d
那么b
和d
是否是两个不同的对象,即使它们具有相同的属性?我会这么想,因为他们没有任何共同的记忆
最后,如果我想对我的一个节点进行深度复制,是
e = Node(a.key))
足够吗?是
b
和d
具有相同的属性,但它们是两个独立的实例。要了解这一点:
print id(b) # one number
print id(d) # new number
这证明它们是记忆中的两个不同对象。要查看a.right
与c
是同一对象,请使用相同的技术,检查等效的id值
print id(a.right)
print id(c) # same
是
b
和d
具有相同的属性,但它们是两个独立的实例。要了解这一点:
print id(b) # one number
print id(d) # new number
这证明它们是记忆中的两个不同对象。要查看a.right
与c
是同一对象,请使用相同的技术,检查等效的id值
print id(a.right)
print id(c) # same
是的,这些只是对左或右对象的引用。 每次执行
节点(“some_str
),都会创建一个新对象。因此b
&d
将有所不同,并且会为e=Node(a.key))
创建一个新对象。
执行
e=Node('e')
和执行f=e
将是相同的,其中f
和e
指的是同一对象。是的,这些只是指左或右对象。
每次执行节点(“some_str
),都会创建一个新对象。因此b
和d
将有所不同,并且将为e=Node(a.key))
创建一个新对象。
执行e=Node('e')
和执行f=e
将是相同的,其中f
和e
引用相同的对象。Python是动态键入的,因此不能说左和右是引用。还可以在其中存储整数或浮点。您甚至可以先存储一个整数,然后存储对对象的引用,然后在其中存储一个浮点,因此类型可能会随时间而变化。但如果您对对象执行赋值。这确实会产生一个指针(这与您的问题在语义上存在巨大差异)
对于第二个问题,这取决于您如何看待深度复制。如果节点包含对其他节点的引用,是否还要复制这些节点
如果只想生成具有相同值但引用相同其他节点的新节点,请使用:,否则使用
区别在于:
B <- A -> C B' <- D -> C'
^ ^
| |
\-- S --/
不完全正确,因为您没有将(潜在)引用复制到左侧和右侧节点,而且这不是一个好的设计,因为您可以将更多项目附加到节点,并且每次都需要修改复制功能。因此,使用copy.copy
-函数更安全。Python是动态键入的,因此不能说left
和right
是引用。还可以在其中存储整数或浮点。您甚至可以先存储一个整数,然后存储对对象的引用,然后在其中存储一个浮点,因此类型可能会随时间而变化。但如果您对对象执行赋值。这确实会产生一个指针(这与您的问题在语义上存在巨大差异)
对于第二个问题,这取决于您如何看待深度复制。如果节点包含对其他节点的引用,是否还要复制这些节点
如果只想生成具有相同值但引用相同其他节点的新节点,请使用:,否则使用
区别在于:
B <- A -> C B' <- D -> C'
^ ^
| |
\-- S --/
不完全正确,因为您没有将(潜在)引用复制到左侧和右侧节点,而且这不是一个好的设计,因为您可以将更多项目附加到节点,并且每次都需要修改复制功能。因此,使用copy.copy
-函数更安全。是的,左侧和右侧是引用。您可以将此连接视为将两个节点绑定在一起的分支。@meto:因此每个节点最多有两条边?@CommuSoft Yes让我们假设这是一棵二叉树。如果现在,我可以使用一个名为children
的属性,这是一个节点列表,它不会改变我问题的本质,我相信。@Meto:这不一定是树,因为你可以声明a.left=b
和b.right=a
创建树中不允许的循环。如果你想要一个新的副本而不是引用,你可以使用标准库中的复制模块。是的,左和右是引用。您可以将此连接视为将两个节点绑定在一起的分支。@meto:因此每个节点最多有两条边?@CommuSoft Yes让我们假设这是一棵二叉树。如果现在,我可以使用一个名为children
的属性,这是一个节点列表,它不会改变我问题的本质,我相信。@Meto:这不一定是一棵树,因为你可以声明a.left=b
和b.right=a
创建一个树中不允许的循环。如果你想要一个新的副本而不是引用,你可以使用标准库中的复制模块。我希望这不会因为“指针”这个术语而被否决。对我来说,术语“引用”和“指针”基本上是可以互换的,Python中的每个名称都是引用!甚至Python中的“容器”也只是引用的集合。一些标点符号和措辞可以稍微清理一下(有不匹配的引号和括号,最后一句有点不清楚),但除此之外,我看不出有什么不对