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也会发生同样的情况。