Rien n’empêche une liste d’être récursive. Comparer deux structures récursives ne va rien donner de bon: la comparaison va se faire récursivement sur les éléments, chaque comparaison provoquant un nouvel appel de fonction, jusqu’à ce que la pile d'appel explose...
Une version simplifiée de ton exemple serait:
l1 = []
l1.append(l1)
l2 = []
l2.append(l2)
l1 == l2 # RecursionError
Tu peux montrer que la liste se contient elle même:
l1 is l1[0] # True
# ...
l1 is l1[0][0][0][0][0] # True
# etc...
On peut s'amuser a faire pareil avec des dictionnaires:
d1 = {}
d1[0] = d1
d2 = {}
d2[0] = d2
d1 == d2 # RecursionError
La raison pour laquelle l1 == l1
ne provoque pas de RecursionError
est que la comparaison vérifie tout d'abord l’identité, et renvoie True
dans ce cas.
Plus curieux, on peut obtenir des résultats a priori surprenants:
>>> l = []
>>> l.append(l)
>>> l
[[...]]
>>> [l]
[[[...]]]
>>> l == [l]
True
La raison est que la comparaison se fait élément par élément, or le premier élément de [l]
est l
, ce qui est aussi le cas pour l
vu qu'elle est récursive, le résultat est donc True
.