我写了一个函数SwapCities,它能够在列表中交换条目3和4.
所以fe [0,1,2,3,4]应该变成[0,1,2,4,3].这个功能很完美,但奇怪的是我的原始列表也改变了我不想要的.
这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
print "Start"
IncumbentSolution = list(x for x in range(0,NumberOfCities))
print IncumbentSolution
print "After swap" NewSolution = SwapCities(IncumbentSolution)
print NewSolution
print "Original solution"
print IncumbentSolution
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
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 this change?!)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,我原来的解决方案发生了变化.
我不知道为什么会这样.即使我更改代码以使更改应用于原始列表的副本,我也会得到此结果.有人能解释我做错了吗?
IncumbentSolution = list(x for x in range(0,NumberOfCities))
print "Start"
print IncumbentSolution
print "After swap"
tmpsolution = IncumbentSolution
NewSolution = SwapCities(tmpsolution)
print NewSolution
print "Original solution"
print IncumbentSolution
Run Code Online (Sandbox Code Playgroud)
SwapCities正在改变的内容solution.由于solution指向同一列表IncumbentSolution,因此内部的值IncumbentSolution也会改变.
要保留原始值IncumbentSolution,请创建列表的新副本:
tmpsolution = list(IncumbentSolution)
Run Code Online (Sandbox Code Playgroud)
制作原始列表的浅表副本.由于内容IncumbentSolution是不可变数字,因此浅拷贝就足够了.如果包含的内容,例如dicts哪些内容也在变异,那么您需要制作列表的深层副本:
import copy
tmpsolution = copy.deepcopy(IncumbentSolution)
Run Code Online (Sandbox Code Playgroud)