【问题标题】:'RuntimeError: maximum recursion depth exceeded in cmp' when working with lists'RuntimeError: cmp 中超出最大递归深度' 使用列表时
【发布时间】:2013-01-09 20:42:24
【问题描述】:

我在处理列表时遇到了错误RuntimeError: maximum recursion depth exceeded in cmp。更准确地说,p0 in pointspoints.index(p0) 方法调用以及points 列表上的points.remove(p0) 方法调用一直在我的points 列表的特定索引处引发特定字典p0 的错误. pointslist 在发生错误时包含 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

【问题讨论】:

  • 你能给我们看一些代码吗?
  • p0 只是一个普通的旧 python 字典?
  • 我仍然没有看到任何递归。向我们展示更多代码! find 来自哪里?
  • p0 是一个字典(使用{} 创建)。我刚刚添加了find 的定义。据我了解递归的概念,我的代码中没有任何递归。
  • @Eric:错误似乎是由列表对象的本机方法引发的。回溯只显示一个级别。

标签: python list


【解决方案1】:

您可能有一个循环结构,其中一个 dicts 通过'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': {...}}}

也许这可以帮助找到字典中有问题的部分。

【讨论】:

  • 该死,我快到了! +1
  • 确实是这样,但是我不明白为什么列表的本机方法会使用==而不是is用于removeindex等方法?我应该使用什么类型的对象来包含我的数据?
  • @Morhaus:这就是列表和字典的语义。也许您最好为您的对象定义自己的class,而不是使用dict。如果您没有定义任何特殊的比较方法,那么对于这些​​自定义对象,== 将与 is 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2013-02-20
  • 2017-03-18
  • 2015-04-15
  • 2023-01-30
相关资源
最近更新 更多