<p>你有几个问题。调试是一件艰难的事情,尤其是当它是您自己的代码时。我给你的第一个建议是开始在代码中放入print语句,看看问题出在哪里,出了什么问题。如果你希望“mylist”之类的东西看起来总是一样的,那就去看看它是否会改变。在</p>
<p>话虽如此,事情是这样的:</p>
<p>我的第一个建议是检查一下在每次合并中“mylist”会发生什么。现在你认为问题出在合并3。但在你到达那一步之前,确实有一些奇怪的事情发生了。在</p>
<p>在merge2中使用对merge2的递归调用。这太棒了,因为递归太棒了。但是当你到达这两个列表的末尾时会发生什么呢?当列表被传递到函数中时,它们发生了什么?如果merge2到达x或y的末尾,它将返回x或y。但是x或y是什么呢?它们是传入python的原始列表,随着时间的推移,<strong>被修改了</strong>。在merge2中,实际上是在更改传入的列表。但是,你可能会说,当我复制这些列表时,也会发生同样的事情!好的,让我们用标准的temp_lists=list(mylist)复制一个列表,并检查您传入的所有内容的ID。注释出a()、c()和d()并将b()改为如下所示并检查:</p>
<pre><code>@timeit
def b():
temp_lists = []
temp_lists = list(mylists) #making our copy here
print "in b"
print "id of temp_lists is: ", id(temp_lists)
print "id of mylists is: ", id(mylists)
print "id of temp_lists[0] is: ", id(temp_lists[0])
print "id of mylists[0] is: ", id(mylists[0])
print lmerge(temp_lists, merge2)
print "after b"
print "id of temp_lists[0] is: ", id(temp_lists[0])
print "id of mylists[0] is: ", id(mylists[0])
</code></pre>
<p>输出应如下所示:</p>
^{pr2}$
<p>注意temp_list和mylist的id不同,但是temp_list[0]和mylist[0]的id是相同的。这意味着当你从每个列表中弹出一些东西来合并它们时,你正在修改原始列表。有几种方法可以解决这个问题。退房复制.deepcopy()或者,根据此问题的上下文,编写自己的方法递归地复制列表。在</p>
<p>您还有其他问题(例如,如果您在我的列表中传入一个空列表,会发生什么情况?)但是,现在,您的问题在于如何处理传入merge2的列表。在</p>