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.edges
和 two.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
仍然是可变的,因此如果调用者不希望它被更改,它也可能导致细微的错误。
我有一个类似这样的 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.edges
和 two.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
仍然是可变的,因此如果调用者不希望它被更改,它也可能导致细微的错误。