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

时间:2018-12-29 04:43:03

标签: python python-2.x

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

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)

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

one.addEdge(two)

现在出现了令人惊讶的地方。当我检查one.edgestwo.edges的值时,我得到了-

  

one.edges   [<< strong>主。位于0x109ed3e50>的节点对象]

     

two.edges   [<< strong>主要。节点对象位于0x109ed3e50>]。

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

1 个答案:

答案 0 :(得分:3)

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

>> 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仍然是可变的,因此如果调用者不希望更改它,则它也可能导致细微的错误。