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

Python创建在所有类对象之间共享的静态对象,python,python-2.x,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(

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

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.edges
two.edges
的值时,我得到-

一、边缘 []

两条边 […]


如果看到两个对象都已获得值。我对此感到困惑,不知道为什么会发生这种情况。这就是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

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

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

>> 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

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

对不起。更新了它。那是一封。加上两封可能重复的道歉信。更新了它。它是一个。addEdge(两个)可能与的重复,因此init方法中的这个
edges=[]
是罪魁祸首?是的,很多人会说使用可变对象作为默认参数是个坏主意。好的。这是出乎意料的。当我们将{}文本作为默认参数传递时,是否也会发生同样的情况?是的,@RajKumar也会发生同样的情况。因此init方法中的
edges=[]
就是罪魁祸首?是的,许多人会说使用可变对象作为默认参数是个坏主意。好的。这是出乎意料的。当我们将{}文本作为默认参数传递时,会发生同样的情况吗?是的,@RajKumar也会发生同样的情况。