Python 创建在所有 class 个对象之间共享的静态对象

Python creating static objects which are shared amongst all class objects

我有一个类似这样的 class 节点。它是图形的典型节点对象。

class Node(object):
    def __init__(self, data, edges = []):
        super(Node, self).__init__()
        self.data = data
        self.edges = edges
        self.visited = False

    def addEdge(self, *args):
        print(self)
        self.edges.extend(args)
        print(self.edges)

我创建了两个这样的对象 -

one = Node(1)
two = Node(2)

接下来我使用上面定义的addEdge方法将two的指针添加到one -

one.addEdge(two)

现在来了令人惊讶的一点。当我检查 one.edgestwo.edges 的值时,我得到这个 -

one.edges [<main.Node object at 0x109ed3e50>]

two.edges [<main.Node object at 0x109ed3e50>].

如果你看到两个对象都获得了值。我对此感到很困惑,不知道为什么会这样。这是 python 的行为方式吗?如果可以,您能解释一下这种行为吗?

使用数组文字作为默认值时需要小心,因为您不会为每个实例都获得一个新数组 - 您会获得对同一个数组的引用。在您的示例中,您将看到:

>> one.edges is two.edges
True

您需要做一些事情来确保每次都能得到一个新数组。您可以做的一件事是:

self.edges = list(edges)

另一种选择是:

def __init__(self, data, edges = None):

   if edges is None:
        self.edges = []
   else:
        self.edges = edges

但是 edges 仍然是可变的,因此如果调用者不希望它被更改,它也可能导致细微的错误。