Проблема с копированием объектов в python

401 просмотра
0
0 Комментариев

Привет. В цикле генерирую объекты и записываю их в переменную response. Указанную переменную добавляю в список. Приведу пример:

answer = []
for query in listOfLogs:
    response = {}
    response = Request(query)
    elem = {"response": response, "query": query, 'isNull': False}
    answer.append(elem)
    for item1 in answer:
        print item1
    print "###"

В результате, почему-то в списке оказываются ссылки на response и при каждом новом создании объекта response функцией Request у меня все элементы списка перезаписываются. Хотелось бы, чтобы в список происходило копирование объекта, а не добавление его по ссылке. Приведу пример лога:

        Луговая  Рыбачье
###
        Луговая (эксп.) Рыбачье
        Луговая (эксп.) Рыбачье
###
        ЛуговаяРыбачье
        ЛуговаяРыбачье
        ЛуговаяРыбачье
###
     Ногинск, Горьковское шоссе, 56 км, дом 1
     Ногинск, Горьковское шоссе, 56 км, дом 1
     Ногинск, Горьковское шоссе, 56 км, дом 1
     Ногинск, Горьковское шоссе, 56 км, дом 1
###

Подскажите, как это сделать?


Добавить комментарий

1 Ответы

Python Опубликовано 18.12.2018
0

В питоне всегда и всё передаётся по ссылке. Для того, чтобы передавать не по ссылке, нужно явно скопировать объект «специально обученной для этого функцией» deepcopy из пакета copy:

import copy
 
answer = []
for query in listOfLogs:
    response = {}
    response = Request(query)
    elem = {"response": copy.deepcopy(response), "query": copy.deepcopy(query), 'isNull': False}
    answer.append(elem)
    for item1 in answer:
        print item1
    print "###"

Замечу, что в питоне есть две подобные функции: copy и deepcopy. deepcopy делает полное копирование, а copy — поверхностное (не в привычном понимании). Пример их использования и отличия можно найти здесь

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up