'RuntimeError: le maximum de la profondeur de récursion dépassé en cmp' lorsque l'on travaille avec des listes
J'ai rencontré l'erreur RuntimeError: maximum recursion depth exceeded in cmp
lorsque l'on travaille avec des listes. Plus précisément, p0 in points
, le points.index(p0)
appel de la méthode ainsi que la points.remove(p0)
appel de méthode sur l' points
liste ont été la collecte de l'erreur d'un dictionnaire spécifique p0
à un indice spécifique de mon points
liste. Le points
liste contient 4700 dictionnaires au moment de l'erreur réduite d'un dictionnaire à l'autre par un à partir d'une liste de 12000 objets jusqu'à ce que l'erreur est générée. Le p0
dictionnaire contient une référence à un autre dictionnaire dans la liste, ce qui en retourne contient une référence à la p0
objet. Le p0
dictionnaire ainsi que le dictionnaire qu'il contient une référence à apparaître deux fois dans la points
liste avant de l'erreur est déclenchée par l'une des trois appel de méthode.
D'où vient cette erreur vient?
MODIFIER: Voici le code qui génère l'erreur.
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
Voici la définition de l' find
, où dist
calcule la distance entre deux points.
def find(p1, points, tolerance = 0.01):
for p2 in points:
if dist(p2['coords'], p1['coords']) <= tolerance:
return p2
return False
Voici le plein de trace de l'erreur:
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
J'ai édité la question.
p0 est juste un simple vieux python dict?
Je ne vois pas la récursivité. Nous montrer plus de code! Où est
find
venir?L'erreur semble être soulevées par le natif méthodes de l'objet de la liste. Le traceback ne pas montrer quoi que ce soit de plus d'un niveau.
OriginalL'auteur Alexandre Kirszenberg | 2013-01-09
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement une structure circulaire, où l'un de vos dicts se réfère lui-même à travers une chaîne de
'next'
s, comme ceci:Si vous imprimez le dict, une référence circulaire serait de se présenter comme de
...
:Peut-être que cela peut vous aider à trouver la problématique, le cadre de la dict.
C'est effectivement le cas, mais je ne comprends pas pourquoi le natif de méthodes de liste serait utiliser
==
au lieu deis
pour des méthodes telles queremove
etindex
? Ce type d'objet dois-je utiliser pour contenir mes données?C'est juste la façon dont la sémantique des listes et des dicts sont. Probablement, vous êtes mieux de définir vos propres
class
pour vos objets au lieu d'utiliser undict
. Si vous ne définissez aucune spécial méthodes de comparaison de==
sera le même queis
pour ces objets personnalisés.OriginalL'auteur sth