为什么Python类变量的作用类似于静态变量?

时间:2020-07-27 16:48:29

标签: python python-3.x

我创建了这样的节点类:

  def __init__(self, data, incoming = [], outgoing = []):
    self.data = data
    self.incoming = incoming
    self.outgoing = outgoing

  def addIncoming(self, incoming):
    self.incoming.append(incoming)

  def addOutgoing(self, outgoing):
    self.outgoing.append(outgoing)

每个实例都像Node(number)那样初始化,因此传入和传出参数默认为空列表。我还具有将其他节点附加到传入和传出列表的函数,但是当我这样做时,它会附加到每个实例。例如,假设我有a=Node(1)b=Node(2)。如果我做了a.addIncoming(b)并打印了a.incomingb.incoming,它们都将打印Node b。为什么在单独的实例之间共享这些值?

当我将初始化函数更新为

  def __init__(self, data, incoming = [], outgoing = []):
    self.data = data
    self.incoming = []
    self.outgoing = []

一切正常,但是我觉得两者应该一样。我在这里误会什么?

1 个答案:

答案 0 :(得分:2)

在定义函数时评估默认参数,并将其与该函数一起存储。因此__init__会得到这些空列表,但是每次您修改它们时,所做的修改都会被保存。

请记住,在Python中,用=进行新赋值不会复制数据。这些列表将与您进行的每个作业共享。