python类中奇怪的事情?

python类中奇怪的事情?,python,arrays,python-2.7,python-3.x,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 ) ) class NODE: connections

我试图用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 ) )
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
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类中来连接它们。我遇到了一些问题,我认为问题在于递归类,所以为了测试我做了这个
其中连接是节点类中的空白数组

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:您的代码如下所示:

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 ) )
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
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
解决方案:类实例属性应该在
\uuuu init\uuu
中定义。如果在类级别定义
连接
,则
节点
的每个实例将共享同一个
连接
列表

class NODE:
    def __init__(self, value):
        self.value = value
        self.connections = []

可能性2:您的代码如下所示:

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 ) )
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
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
解决方案:参数列表中的默认值只创建一次,因此使用该默认值的
节点的所有实例将共享同一个列表。使用不可变的sentinel值指示未传递任何参数<代码>无
通常适用于此任务

class NODE:
    def __init__(self, value, connections = None):
        self.value = value
        if connections is not None:
            self.connections = connections
        else:
            self.connections = []

可能性1:您的代码如下所示:

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 ) )
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
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
解决方案:类实例属性应该在
\uuuu init\uuu
中定义。如果在类级别定义
连接
,则
节点
的每个实例将共享同一个
连接
列表

class NODE:
    def __init__(self, value):
        self.value = value
        self.connections = []

可能性2:您的代码如下所示:

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 ) )
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
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
解决方案:参数列表中的默认值只创建一次,因此使用该默认值的
节点的所有实例将共享同一个列表。使用不可变的sentinel值指示未传递任何参数<代码>无
通常适用于此任务

class NODE:
    def __init__(self, value, connections = None):
        self.value = value
        if connections is not None:
            self.connections = connections
        else:
            self.connections = []

如果没有看到包含实际的
节点
类的,就很难回答这个问题。让我猜,
类节点
有一个静态字段
连接
,而不是在构造函数中将
连接
初始化为一个新列表,以便所有对象共享一个连接列表?请出示你的
节点
类。我要继续说,这是.yes的副本。这就是问题所在。我写它的时候,就好像我要用Java或cpp写东西一样。谢谢你们的帮助!哪一个是问题?静态属性还是可变的默认参数?如果没有看到包含实际
节点
类的,那么很难回答这个问题。让我猜,
类节点
有一个静态字段
连接
,而不是在构造函数中将
连接
初始化到一个新列表,使所有对象共享一个连接列表?请出示你的
节点
类。我要继续说,这是.yes的副本。这就是问题所在。我写它的时候,就好像我要用Java或cpp写东西一样。谢谢你们的帮助!哪一个是问题?静态属性还是可变的默认参数?是的,就是这样。谢谢你的回答!这也会解决我的很多其他问题!是的,就是这样。谢谢你的回答!这也会解决我的很多其他问题!