Работа со списками. Проблема с использованием функции append()

Потрошитель чебурашек

Новичок
Пользователь
Июл 15, 2022
3
0
1
Приветствую участников форума. Ребят, подскажите пожалуйста, уже голову сломал. Суть проблемы заключается в следующем. Есть 3 списка после парсинга. В первом лежат юзернеймы, во втором даты, в третьем комментарии. Мне необходимо создать список словарей по типу [{'username: 'xxx', 'date': 'xxx-xxx', 'comment': 'xxxxxxxxx'}, {'username: 'xxx', 'date': 'xxx-xxx', 'comment': 'xxxxxxxxx'}, {'username: 'xxx', 'date': 'xxx-xxx', 'comment': 'xxxxxxxxx'}]. Как это делаю я:
Python:
    # В списке list_obj_author лежат юзернеймы. Но все 3 списка одинакового размера
    # поэтому для задания условий цикла я взял первый(не принципиально)
    dictionary_data = {}
    list_data = []
    while list_obj_author:
        dictionary_data['author'] = list_obj_author.pop()
        dictionary_data['date'] = list_obj_date.pop()
        dictionary_data['comment'] = list_obj_comment.pop()
        list_data.append(dictionary_data)
Теперь, если я вывожу с помощью print после цикла список list_data, то вижу список в котором повторяется последний словарь. Такое впечатление как будто метод append() вместо того чтобы добавлять словарь в конец списка просто перезаписывает список целиком. Если я пишу print внутри цикла, то да, вижу всё как надо. Подскажите плиз.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Такое впечатление как будто метод append() вместо того чтобы добавлять словарь в конец списка просто перезаписывает список целиком.
В цикле вы меняйте значение ключей словаря и потом добавляйте словарь в список. В итоге у вас получается список одинаковых словарей, значения в ключах у которых будут соответствовать последним записанным в них в цикле значениям.
Чтобы в списке были разные словари нужно на каждой итерации цикла добавлять в него новый словарь.

Python:
list_data = []
while list_obj_author:
    dictionary_data = {}
    dictionary_data['author'] = list_obj_author.pop()
    dictionary_data['date'] = list_obj_date.pop()
    dictionary_data['comment'] = list_obj_comment.pop()
    list_data.append(dictionary_data)
 

Потрошитель чебурашек

Новичок
Пользователь
Июл 15, 2022
3
0
1
И, да, я append() не корректно функцией назвал в заголовке, прошу прощения, метод append()
 

Потрошитель чебурашек

Новичок
Пользователь
Июл 15, 2022
3
0
1
В цикле вы меняйте значение ключей словаря и потом добавляйте словарь в список. В итоге у вас получается список одинаковых словарей, значения в ключах у которых будут соответствовать последним записанным в них в цикле значениям.
Чтобы в списке были разные словари нужно на каждой итерации цикла добавлять в него новый словарь.

Python:
list_data = []
while list_obj_author:
    dictionary_data = {}
    dictionary_data['author'] = list_obj_author.pop()
    dictionary_data['date'] = list_obj_date.pop()
    dictionary_data['comment'] = list_obj_comment.pop()
    list_data.append(dictionary_data)
А, всё, понял. У меня словарь объявлен глобально, а нужно было его объявить в теле цикла. Спасибо огромное. Я просто относительно недавно Питоном занимаюсь. Ошибка по сути детская.
 

Форум IT Специалистов