Проблема с Python списком взаимодействия с циклом for - PullRequest
1 голос
/ 28 марта 2020

У меня проблема с моим алгоритмом оптимизации функций genti c, который я пытаюсь построить. Идея состоит в том, что будет проверена указанная c комбинация характеристик, и если точность модели, использующей эти функции, выше, чем предыдущий максимум, тогда комбинация функций заменяет предыдущую максимальную комбинацию. при прохождении через оставшиеся потенциальные объекты таким образом, окончательная комбинация должна быть оптимальной комбинацией объектов с учетом размера вектора объектов. В настоящее время код для достижения этой цели выглядит следующим образом:

def mutate_features(features, feature):
    new_features = features
    index = random.randint(0,len(features)-1)
    new_features[index] = feature
    return new_features

def run_series(n, f_list, df):
    features_list = []
    results_list = []
    max_results_list = [[0,0,0,0,0]]
    max_feature_list = []
    features = [0,0,0,0,1]
    for i in range(0,5):  # 5 has just been chosen as the range for testing purposes
        results = run_algorithm(df, f_list, features)
        features_list.append(features)
        results_list.append(results)
        if (check_result_vector(max_results_list, results)):
            max_results_list.append(results)
            max_feature_list.append(features)
        else:
            print("Revert to previous :" +str(max_feature_list[-1]))
            features = max_feature_list[-1]
        features = mutate_features(features, f_list[i])
        print("Feature List = " +str(features_list))
        print("Results List = " +str(results_list))
        print("Max Results List = " +str(max_results_list))
        print("Max Feature List = "+str(max_feature_list))

Вывод этого кода был включен ниже;

Output Нажмите, чтобы увеличить или увеличить фотографию

Раздел, который я не понимаю, является выводом max_feature_list и feature_list.

Если что-либо добавленный с помощью .append() к max_feature_list или feature_list внутри для l oop, кажется, что все элементы, которые уже являются членами списка, изменяются так же, как и последнее добавление в список , Возможно, я не совсем понимаю синтаксис / logi c вокруг этого и буду очень признателен за любые отзывы о том, почему программа делает это.

1 Ответ

3 голосов
/ 28 марта 2020

Это происходит потому, что вы изменяете значения features внутри функции mutate_features, а затем, поскольку добавление к max_feature_list является ссылкой, заполненные значения в max_feature_list тоже меняются, потому что их базовое значение изменилось.

Один из способов предотвратить такое поведение - это deepcopy features внутри mutate_features, мутировать скопированные объекты, как вам нужно, а затем вернуть его.

Например:

from copy import deepcopy

def mutate_features(features, feature):
    new_features = deepcopy(features)
    index = random.randint(0,len(features)-1)
    new_features[index] = feature
    return new_features


features = [1, 2, 3]
res = []
res.append(features)
features = mutate_features(features, feature)
res.append(features)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...