Python错误:列表比较中超出最大递归深度

0 投票
1 回答
979 浏览
提问于 2025-04-18 08:15

这里是构造的内容

#list1 and list2
list1 = [(True,), (True,)]
list2 = [(True,), (True,)]
#Transformation
list1[0] = list2
list1[1] = list1
list2[0] = list1
list2[1] = list2

这段代码的输出是:

#Result
#list1 = [ list2 , list1 ]
#list2 = [ list1 , list2 ]

当我运行这段代码时

>>>list2 in list1
True
>>>list1 in list1
RuntimeError: maximum recursion depth exceeded in comparison

我认为错误发生的原因是,获取list1的实际值进行比较时导致了一个无尽的循环。不过,尽管list2的构造方式类似,但并没有出现这个错误。

所以我的问题是,为什么会出现这样的错误差异?难道“list2 in list1”也应该导致错误吗?

1 个回答

3

如果你这样做:

list = [1,2,3]
list.append(list)

它并不会这样做:

list.append([1,2,3])

这其实是在创建一个新的列表。它只是把一个“引用”添加到这个列表中。这是因为复制那些不是基本类型的东西,通常不是你想要的结果(这里提到的PHP的例子可以忽略)。

所以假设你这样做:

list.append(4)

现在:

print(list[3][4])

会显示4,因为第三个东西(其实是第四个,因为索引是从零开始的)是列表的引用,我们查看的是第四个(第五个),也就是我们刚刚添加的4。所以:

list is list[3]

这个说法是对的,它们指向的是同一个实际的列表。

递归发生的原因和你不能直接用print(list)一样,它开始查找,然后就会不断地在自己里面查找,陷入无尽的循环。

这个过程会结束,因为Python有一个最大调用深度,默认是500次,我记得是这样。也就是说,你可以让一个函数调用另一个函数,再调用另一个函数……最多再加497次。你的代码永远不会结束,所以会撞上这个限制。

撰写回答