使用列表时我遇到了错误RuntimeError: maximum recursion depth exceeded in cmp
。更准确地说,p0 in points
,points.index(p0)
方法调用以及points.remove(p0)
列表上的points
方法调用一直在引发特定字典p0
的错误在我的points
列表的特定索引处。 points
列表在错误发生时包含4700个词典,从12000个对象列表中将一个词典减少一个,直到出现错误。 p0
字典包含对列表中另一个字典的引用,返回时包含对p0
对象的引用。 p0
字典及其包含的字典引用在points
列表中出现两次之前,通过三种方法调用中的任何一种引发错误。
这个错误来自哪里?
编辑:这是引发错误的代码。
for roadType in roadTypes:
points = roadPoints[roadType][:]
while len(roadTails[roadType]) > 0:
p0 = roadTails[roadType].pop()
p1 = p0['next']
points.remove(p0) # Where the error occurs
points.remove(p1)
while True:
p2 = find(p1, points, 0.01)
if p2:
points.remove(p2)
p3 = p2['next']
points.remove(p3)
if p3 in roadTails[roadType]:
roadTails[roadType].remove(p3)
break
else:
p0, p1 = p2, p3
continue
else: break
以下是find
的定义,其中dist
计算两点之间的距离。
def find(p1, points, tolerance = 0.01):
for p2 in points:
if dist(p2['coords'], p1['coords']) <= tolerance:
return p2
return False
这里是错误的完整追溯:
Traceback (most recent call last):
File "app.py", line 314, in <module>
points.remove(p0) # Where the error occurs
RuntimeError: maximum recursion depth exceeded in cmp
答案 0 :(得分:9)
可能你有一个循环结构,你的一个dicts通过一串'next'
来引用自己,就像这样:
>>> a = {}
>>> b = {}
>>> a['next'] = b
>>> b['next'] = a
>>> a == b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: maximum recursion depth exceeded in cmp
如果您打印出dict,循环引用将显示为...
:
>>> a
{'next': {'next': {...}}}
也许这有助于找到字典中有问题的部分。