我的问题与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