Инициализировать словарь, где каждый элемент представляет собой список пустых уникальных списков - PullRequest
1 голос
/ 24 февраля 2020

Мне очень жаль, если об этом уже спрашивали, но, хотя я мог найти что-то похожее, я не нашел своей конкретной проблемы c. У меня Python 3.7.4 - 64 бит. В основном я хочу инициализировать словарь, где каждый элемент представляет собой список пустых списков. Проблема в том, что, как я это делаю сейчас, я получаю, что каждый пустой подсписок из списка разных элементов - это один и тот же объект, хотя я назначаю копию списка каждому элементу. Как видно из кода ниже, каждый подсписок в empty_list_of_lists - это отдельный объект. Затем я назначаю элементы в словарь как копию empty_list_of_lists. Когда я звоню my_dict['a'] is my_dict['b'], я получаю ожидаемое False, но когда я звоню my_dict['a'][0] is my_dict['b'][0], я получаю True, что меня озадачивает, потому что empty_list_of_lists[0] is empty_list_of_lists[1] возвращает False, а я не получаю лог c. Как я должен go об этом?

Вот мой код:

empty_list_of_lists = [[] for i in range(5)]

print(empty_list_of_lists[0] is empty_list_of_lists[1]) # returns False --> expected

dict1 = {'a': empty_list_of_lists.copy(), 'b': empty_list_of_lists.copy()}

print(dict1['a'] is dict1['b'])  # returns False --> expected
print(dict1['a'][0] is dict1['b'][0])  # returns True --> What?

1 Ответ

0 голосов
/ 24 февраля 2020

вы можете использовать:

dict1 = {'a': [[] for _ in range(5)], 'b': [[] for _ in range(5)]}

или вы можете использовать copy.deepcopy

import copy

dict1 = {'a': copy.deepcopy(empty_list_of_lists), 'b': copy.deepcopy(empty_list_of_lists)}

вы можете узнать больше об операциях мелкого и глубокого копирования здесь

в вашем коде вы используете поверхностную копию, но вам нужна глубокая копия из приведенных выше документов:

Полная копия создает новый составной объект, а затем (в той степени, в которой возможно) вставляет в него ссылки на объекты, найденные в оригинале.

Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...