python - Output List Duplicating Values -
my function same_num takes values common both sorted lists , appends them onto 'result'. it's using recursion , 2 offsets, pos1 , pos2 set 0, compare values in list. when running function, works fine first time, if run function second time, original result appended answer got running initially. going wrong?
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)
for example:
same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1,2,3,4]
rerunning previous example in shell produces:
same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1, 2, 3, 4, 1, 2, 3, 4]
when should still produce:
[1,2,3,4]
the problem result
global variable. globals bad! adding stuff result
(result.append(...)
) never clearing out after first invocation of same_num
function.
(although can see why taking approach, because conceptually easier approach recursive functions using global variables.)
if make result
parameter of same_num
function can passed recursive invocations of same function... issue fixed.
def same_num(list1,list2,pos1,pos2,init_result=none): # important: see remark below on why init_result=[] # not expect result = init_result if init_result 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 return 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) )
by way, see "common python gotchas: mutable default arguments" why used init_result=none
default, rather init_result=[]
.
Comments
Post a Comment