使用列表时出现“ RuntimeError:最大递归深度超出cmp”
问题内容:
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
问题答案:
可能您有一个循环结构,其中一个字典通过'next'
s链来引用自身,如下所示:
>>> 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
如果打印出该字典,则循环引用将显示为...
:
>>> a
{'next': {'next': {...}}}
也许这可以帮助找到该词典中有问题的部分。