Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中图的节点_Python_Class - Fatal编程技术网

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中的“容器”也只是引用的集合。一些标点符号和措辞可以稍微清理一下(有不匹配的引号和括号,最后一句有点不清楚),但除此之外,我看不出有什么不对