繁体   English   中英

为什么我的原始列表会更改?

[英]Why does my original list change?

我写了一个函数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

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

我得到以下结果:

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?!)

如您所见,我原来的解决方案已更改,这是不应该的。

我不知道为什么会这样。 即使当我更改代码,以便将更改应用于原始列表的副本时,我也得到此结果。 有人可以解释我在做什么错吗?

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

SwapCities正在改变 solution的内容。 由于solution指向相同的列表, IncumbentSolution ,里面的值IncumbentSolution被改变了。


要保留原始值IncumbentSolution ,使列表的新副本:

tmpsolution = list(IncumbentSolution)

制作原始列表的浅表副本。 由于IncumbentSolution的内容是不可变的数字,因此浅表副本就足够了。 例如,如果内容包括也被突变的dicts ,那么您需要对列表进行深层复制:

import copy
tmpsolution = copy.deepcopy(IncumbentSolution)

那是因为您修改了函数内的列表。

通过将列表传递给函数,您只需创建另一个对同一对象的引用, solutionIncumbentSolution实际上就指向同一列表对象。

您应该使用IncumbentSolution[:]将浅表副本传递给函数。

>>> def func(x):
...     return id(x)
... 
>>> lis = range(5)
>>> id(lis),func(lis)     #both `x` and `lis` point to the same object
(163001004, 163001004)

>>> id(lis),func(lis[:])  #pass a shallow copy, `lis[:]` or `list(lis)`
(163001004, 161089068)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM