2013-01-09 57 views
4

我在處理列表時遇到了錯誤RuntimeError: maximum recursion depth exceeded in cmp。更確切地說,p0 in points,points.index(p0)方法調用以及points.remove(p0)方法調用points列表一直在提高特定字典p0在我的points列表的特定索引處的錯誤。 points列表在錯誤發生時包含4700個字典,從12000個對象列表中減去一個字典,直到錯誤發生。 p0字典包含對列表中另一個字典的引用,該字典在返回中包含對對象的引用。 p0字典以及它包含的參考字典在points列表中出現兩次,在三種方法調用中的任何一種引發錯誤之前。'RuntimeError:在使用列表時,cmp'中超出了最大遞歸深度

這個錯誤來自哪裏?

編輯:這是引發錯誤的代碼。

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 
+2

你能告訴我們一些代碼嗎? – Eric

+0

我編輯了這個問題。 –

+0

p0只是一個普通的舊python字典? – XORcist

回答

9

也許你有一個圓形的結構,其中你的類型的字典中的一個通過'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 

如果您打印字典,一個循環參考將顯示爲...

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

也許這可以幫助找到字典中有問題的部分。

+0

補給它,我到了那裏! ** + 1 ** – Eric

+0

確實如此,但我不明白爲什麼列表的本地方法會使用'=='而不是'is'來執行諸如remove和index等方法?我應該使用什麼類型的對象來包含我的數據? –

+2

@Morhaus:這就是列表和字典的語義。也許你最好爲自己的對象定義自己的'class',而不是使用'dict'。如果你沒有定義任何特殊的比較方法,那麼'=='和那些自定義對象的'is'是相同的。 – sth

相關問題