我有一个类似这样的类节点。这是图形的典型节点对象。
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.edges
和two.edges
的值时,我得到了-
one.edges [<< strong>主。位于0x109ed3e50>的节点对象]
two.edges [<< strong>主要。节点对象位于0x109ed3e50>]。
如果您看到两个对象都已获得值。我对此感到很困惑,也不知道为什么会这样。这是python的行为方式吗?如果可以,您能否解释这种行为?
答案 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
仍然是可变的,因此如果调用者不希望更改它,则它也可能导致细微的错误。