Python. Присваивается то, что не должно
У меня есть метод, который находит лучший результат среди соседей (минимальную разницу между суммами 2 подмножеств): я разделяю переданное множество на 2 подмножества А и В, считаю сумму элементов в каждом подмножестве, считаю модуль разницы этих сумм и если разница меньше той, что была раньше, присваиваю новые значения A_best, B_best, residue_best. В конкретном примере минимальное значение будет на предпоследнем шаге, но проходя последний шаг в цикле A_best и B_best переприсваиваются на значения последнего шага, а residue_best нет, почему так, оно вообще не должно заходить под if???!!!
l = [2,5,9,8,25,15]
def neighbor(multiset):
A = []
A.append(multiset[0])
B = multiset[1:]
residue_best = abs(sum(A) - sum(B))
A_best = A
B_best = B
for i in range(len(multiset)-2):
A.append(B[0])
B.pop(0)
residue = abs(sum(A) - sum(B))
print(A, B, residue)
if residue < residue_best:
residue_best = residue
A_best = A
B_best = B
print('best')
print('end ', A_best, B_best, residue_best)
return A_best, B_best, residue_best
b = neighbor(l)
for i in b:
print(i)
Ответы (1 шт):
Потому что у вас A_best и A - это один и тот же список (ситуация с B_best аналогичная). Конструкция вида A_best = A не делает копию списка, а просто присваивает ссылку . Вот и получается, что вы модифицируете списки A и B, а заодно "меняются" A_best и B_best.
Чтобы реально скопировать список используйте метод copy(): A_best = A.copy().