我的函数same_num获取两个排序列表共有的值,并将它们附加到' result'。它使用递归和两个偏移,pos1和pos2,它们总是初始设置为0,以比较列表中的值。运行该函数时,它第一次正常工作,但是如果我第二次运行该函数,原始结果将附加我最初运行它时得到的答案。我哪里错了?
result=[]
def same_num(list1,list2,pos1,pos2):
list1=sorted(list1)
list2=sorted(list2)
if pos1==len(list1) or pos2==len(list2):
return result
if list1[pos1]==list2[pos2]:
result.append(list1[pos1])
return same_num(list1,list2,pos1+1,pos2+1)
if list1[pos1]>list2[pos2]:
return same_num(list1,list2,pos1,pos2+1)
if list1[pos1]<list2[pos2]:
return same_num(list1,list2,pos1+1,pos2)
例如:
same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1,2,3,4]
在shell中重新运行上一个示例会产生:
same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1, 2, 3, 4, 1, 2, 3, 4]
什么时候还应该产生:
[1,2,3,4]
答案 0 :(得分:2)
问题是result
是一个全局变量。 Globals are bad!您正在向result
(result.append(...)
)添加内容,但在第一次调用same_num
函数后从未将其清除。
(虽然我可以理解为什么你采用这种方法,因为从概念上讲,使用全局变量处理递归函数通常更容易。)
如果使result
same_num
函数的参数可以传递给同一函数的递归调用...这个问题是固定的。
def same_num(list1,list2,pos1,pos2,init_result=None):
# IMPORTANT: see remark below on why init_result=[]
# would not do what you expect
result = init_result if init_result is not None else []
list1=sorted(list1)
list2=sorted(list2)
if pos1==len(list1) or pos2==len(list2):
return result
if list1[pos1]==list2[pos2]:
result.append(list1[pos1])
return same_num(list1,list2,pos1+1,pos2+1,result)
if list1[pos1]>list2[pos2]:
return same_num(list1,list2,pos1,pos2+1,result)
if list1[pos1]<list2[pos2]:
return same_num(list1,list2,pos1+1,pos2,result)
# multiple invocations will return the same (expected) result
print( same_num([3,1,2,4],[3,1,2,4,5,6],0,0) )
print( same_num([3,1,2,4],[3,1,2,4,5,6],0,0) )
顺便提一下,请参阅"Common Python Gotchas: Mutable default arguments",了解我使用init_result=None
作为默认值的原因,而不是init_result=[]
。
答案 1 :(得分:0)
运行该功能时,第一次工作正常,但是如果我 第二次运行该函数,原始结果附加 我最初运行它得到的答案。
这是确切的问题。在再次调用之前,您不会清空之前的result
。 result
仍然包含第一次运行函数时的值。
例如,尝试运行它:
output = same_num([3,1,2,4],[3,1,2,4,5,6],0,0)
print output
result = []
output = same_num([3,1,2,4],[3,1,2,4,5,6],0,0)
print output
两个输出都是[1,2,3,4]