python类中的奇怪之处是什么?

时间:2017-06-06 18:26:33

标签: python arrays python-2.7 python-3.x

我试图在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个对象。但是当我打印内容时,我看到两个......这让我很困惑。

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 = []