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 шт):

Автор решения: GrAnd

Потому что у вас A_best и A - это один и тот же список (ситуация с B_best аналогичная). Конструкция вида A_best = A не делает копию списка, а просто присваивает ссылку . Вот и получается, что вы модифицируете списки A и B, а заодно "меняются" A_best и B_best.

Чтобы реально скопировать список используйте метод copy(): A_best = A.copy().

→ Ссылка