以下是一些代码(Python 2.7):
class Test:
@staticmethod
def BuildSample():
rootItem = Test('root')
childA = Test('ChildA')
rootItem.AppendChildren([childA])
childA.AppendChildren([Test('Child' + str(i)) for i in range(3)])
return rootItem
def __init__(self, name):
self.name = name
self.children = []
def AppendChildren(self, items):
self.children.extend(items)
def GetChildren(self):
return self.children
def GetName(self):
return self.name
sample = Test.BuildSample()
print 'sample.GetName() = ' + sample.GetName()
print 'sample.GetChildren() has ' + str(len(sample.GetChildren())) + ' children.'
print 'childA.GetName() = ' + sample.GetChildren()[0].GetName()
print 'childA.GetChildren() has ' + str(len(sample.GetChildren()[0].GetChildren())) + ' children.'
这是输出:
sample.GetName()= root
sample.GetChildren()有1个孩子 childA.GetName()= ChildA
childA.GetChildren()有3个孩子。
这是我所期待的。现在,如果我通过用这个版本替换构造函数来更改上面的代码:
def __init__(self, name, children=[]):
self.name = name
self.children = children
...我得到以下输出:
sample.GetName()= root
sample.GetChildren()有4个孩子 childA.GetName()= ChildA
childA.GetChildren()有4个孩子。
正在发生的事情是Child0,Child1和Child2项目被添加到根项目和childA项目的子项列表中。
我的问题是,为什么?当没有给出可选的children参数时,这两个方法之间的语义差异是什么?