4

RuntimeError: maximum recursion depth exceeded in cmpリストを操作しているときにエラーが発生しました。より正確にはp0 in points、リストのメソッドpoints.index(p0)呼び出しと同様に、リストの特定のインデックスで特定の辞書のエラーが発生しています。リストには、エラーの時点で 4700 個の辞書が含まれており、エラーが発生するまで、12000 個のオブジェクトのリストから 1 個ずつ辞書を減らしました。ディクショナリには、リスト内の別のディクショナリへの参照が含まれています。このリストには、オブジェクトへの参照が含まれています。ディクショナリとそれに含まれるディクショナリは、3 つのメソッド呼び出しのいずれかによってエラーが発生する前に、リストに 2 回表示される参照を含みます。points.remove(p0)pointsp0pointspointsp0p0p0points

このエラーはどこから来たのですか?

編集:エラーが発生するコードは次のとおりです。

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

の定義は次のとおりです。ここでfinddistは 2 点間の距離を計算します。

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
4

1 に答える 1

10

'next'おそらく、次のように、dictの1つが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

dictを印刷すると、循環参照は次のように表示され...ます。

>>> a
{'next': {'next': {...}}}

多分これは口述の問題のある部分を見つけるのを助けることができます。

于 2013-01-09T21:09:22.137 に答える