Я написал функцию SwapCities, которая может менять записи 3 и 4 в списке.Почему изменился мой первоначальный список?
Так что f.e. [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
О копировании списков: http://stackoverflow.com/a/184660/577423 – Howard
Стоит отметить, что вам не нужно временные переменные, чтобы сделать своп в Python - 'решение [п], решение [м ] = решение [m], решение [n] '. Это более короткое, более читаемое и более эффективное. –
Возможный дубликат: http://stackoverflow.com/questions/11993878/python-why-does-my-list-change-when-im-not-actually-changing-it?rq=1 – carlosdc