【问题标题】:Weird thing in python classes ?python类中有奇怪的东西吗?
【发布时间】:2017-06-06 18:26:32
【问题描述】:

我试图在 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 类中来连接它们。我遇到了一些问题,我认为问题出在递归类上,所以为了测试我做了这个。
其中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 个对象。但是当我打印内容时,我看到了两个....这让我感到困惑。

【问题讨论】:

  • 如果没有看到包含实际 NODE 类的 minimal reproducible example,这真的很难回答。
  • 让我猜猜,class Node 有一个静态字段connections,而不是在构造函数中将connections 初始化为一个新列表,以便所有对象共享一个连接列表?请出示您的Node 班级。
  • 我要继续说这是The mutable default argument的副本。
  • 是的。那就是问题所在。我写它就好像我会用 Java 或 cpp 写东西一样。谢谢大家的帮助!
  • 哪个是问题?静态属性还是可变默认参数?

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


【解决方案1】:

可能性 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 实例将共享同一个列表。使用不可变的标记值来指示没有传递任何参数。 None 通常适合这个任务。

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

【讨论】:

  • 是的,就是这样。谢谢回答 !这也将解决我的许多其他问题!
猜你喜欢
  • 2017-12-08
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多