包含自身实例列表的类

时间:2019-07-01 09:52:49

标签: python python-3.x class object containers

我的问题与https://github.com/twilio/twilio-ruby/blob/08f1ba2f042eeefb29f19f7dd13add40c4117ac9/lib/twilio-ruby/framework/error.rb#L39非常相似,但是应用该解决方案确实存在递归错误。我想创建一个Element类,该类与XML元素具有相同的逻辑:它可以包含一系列子元素:

class Element(object):

  def __init__(self, name, content=[]):
    self.name = name
    self.content = content

  def add(self, sub_element):
    self.content.append(sub_element)

  def show(self):
    print(f"> {self.name} has {len(self.content)} content")
    if self.content:
      for el in self.content:
        el.show()

root = Element('root')
sub = Element('sub')
root.show()
sub.show()
root.add(sub)
root.show()
sub.show()

但是结果很奇怪:将sub添加到root时,它sub添加到sub中,我确实不这样做不知道,是什么导致递归错误。

这是结果:

> root has 0 content
> sub has 0 content
> root has 1 content
> sub has 1 content
> sub has 1 content
> sub has 1 content
> sub has 1 content
[etc.]
     print(f"> {self.name} has {len(self.content)} content")
RecursionError: maximum recursion depth exceeded while calling a Python object

在第四行,sub不应包含任何内容...为什么会发生这种情况?


EDIT :如前所述,该问题在[this one]中进行了描述,解释了我不知道的python详细信息。

长话短说,这是因为列表默认赋值content=[],默认的空列表实际上是一个变量,该变量在函数的每次调用中使用。一种解决方法是按如下方式重写 init 函数:

  def __init__(self, name, content=None):
    self.name = name
    if content is None :
      self.content = []
    else : 
      self.content = content

0 个答案:

没有答案