Python错误:列表比较中超出最大递归深度
这里是构造的内容
#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次。你的代码永远不会结束,所以会撞上这个限制。