python - Why does my original list change? -
i wrote function swapcities able swap entries 3 , 4 in list.
so f.e. [0,1,2,3,4] should become [0,1,2,4,3]. function works perfectly, strangely original list changes not want.
this code:
def swapcities(solution): n = 3##randint(0,numberofcities-1) m = 4##randint(0,numberofcities-1) result = solution temp1 = solution[n] temp2 = solution[m] result[n] = temp2 result[m] = temp1 return result
print "start" incumbentsolution = list(x x in range(0,numberofcities)) print incumbentsolution print "after swap" newsolution = swapcities(incumbentsolution) print newsolution print "original solution" print incumbentsolution
i following result:
how many cities? 8 start [0, 1, 2, 3, 4, 5, 6, 7] after swap [0, 1, 2, 4, 3, 5, 6, 7] original solution [0, 1, 2, 4, 3, 5, 6, 7] (why did change?!)
as can see original solution changed should not do.
i have no clue why happens. when change code such changes applied copy of original list result. explain doing wrong?
incumbentsolution = list(x x in range(0,numberofcities)) print "start" print incumbentsolution print "after swap" tmpsolution = incumbentsolution newsolution = swapcities(tmpsolution) print newsolution print "original solution" print incumbentsolution
swapcities
mutating contents of solution
. since solution
points same list incumbentsolution
, values inside incumbentsolution
altered too.
to preserve original values in incumbentsolution
, make new copy of list:
tmpsolution = list(incumbentsolution)
makes shallow copy of the original list. since contents of incumbentsolution
immutable numbers, shallow copy suffices. if contents included, say, dicts
being mutated, need make deep copy of list:
import copy tmpsolution = copy.deepcopy(incumbentsolution)
Comments
Post a Comment