我试图在python中实现最短路径算法。当我试图在路径上连接我的点时,我遇到了一些麻烦。
我有一个名为NODE的课程 我创建了这些节点的数组,然后在其中创建了新的节点:
nodes = []
for r in range ( 0, 3 ):
for c in range ( 0, 3 ):
nodes.append( NODE( c*WIDTH/20 + 30, r*HEIGHT/20 + 30, 10 ) )
这创建了节点,很好,我可以很好地绘制它们。
起初我尝试通过在NODE类中添加节点对象列表来连接它们。我遇到了一些问题,我认为问题在于递归类,所以要测试我做了这个。
其中连接是NODE类中的空白数组。
nodes[0].connections.append( 0 )
print nodes[0].connections
nodes[1].connections.append( 1 )
print nodes[1].connections
print nodes[0].connections
这是我发现问题的地方,也许我只是愚蠢,或者它是一种语言的东西?不知道,但我以为我会问。
输出是这样的:
[0]
[0,1]
[0,1]
正如你所看到的,我只在索引1中的连接列表中添加了1个对象。但是当我打印内容时,我看到两个......这让我很困惑。
答案 0 :(得分:3)
Possibilty 1:您的代码如下所示:
class NODE:
connections = []
def __init__(self, value):
self.value = value
nodes = [NODE(23), NODE(42)]
nodes[0].connections.append( 0 )
print nodes[0].connections
nodes[1].connections.append( 1 )
print nodes[1].connections
print nodes[0].connections
解决方案:应在__init__
内定义类实例属性。如果您在班级定义connections
,那么NODE
的每个实例都会共享同一个connections
列表。
class NODE:
def __init__(self, value):
self.value = value
self.connections = []
可能性2:您的代码如下所示:
class NODE:
def __init__(self, value, connections = []):
self.value = value
self.connections = connections
nodes = [NODE(23), NODE(42)]
nodes[0].connections.append( 0 )
print nodes[0].connections
nodes[1].connections.append( 1 )
print nodes[1].connections
print nodes[0].connections
解决方案:参数列表中的默认值仅创建一次,因此使用该默认值的所有NODE
实例将共享同一个列表。使用不可变的sentinel值来表示没有传递参数。 None
通常适合此任务。
class NODE:
def __init__(self, value, connections = None):
self.value = value
if connections is not None:
self.connections = connections
else:
self.connections = []