Установка переменной в список со списками внутри в качестве ссылки - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь установить area на List, за исключением случаев, когда требуется изменить area, List останется прежним. Итак, я сделал для l oop, который получил бы каждый элемент из List и добавил бы его в область, но похоже, что почти работает, как если бы я пропустил шаг. Может кто-нибудь объяснить мне, почему он не работает? Желательно не отправлять код, потому что я сам хочу его закодировать, а затем объясню, но если вам действительно нужно, все в порядке.

List = [[1, 1, 1, 2, 1, 1, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [2, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1]]

area = []

for Map_list in range(len(List)):
    area.append([])
    for Map_index in List[Map_list]:
        area[Map_list].append(List[Map_list][Map_index])

Для сравнения:

print(f'area: {area}')
print(f'List: {List}')

1 Ответ

1 голос
/ 17 июня 2020

for Map_list l oop устанавливает Map_list последовательно в индекс каждого списка в List, чтобы эти подсписки можно было использовать в качестве источников для копирования.

for Map_index in List[Map_list]: проходит через значения , а не индексы элементов подсписка. Но оператор

area[Map_list].append(List[Map_list][Map_index])

использует Map_index в качестве индекса, поэтому он не дает желаемого эффекта. Он использует данные из подсписка в качестве индекса подсписка.

Чтобы получить желаемый эффект от изменений в area, не влияющих на List, вы должны использовать функцию deepcopy из copy модуль стандартной библиотеки. Это также означает, что вам больше не нужны вложенные циклы for.

Предлагаемое решение area = [*List] решает проблему создания списка, который выглядит одинаково, но не удовлетворяет требованию, изменяющемуся на List не должно влиять на area. Демонстрация:

>>> list1 = [[1]]
>>> list2 = [*list1]
>>> list1
[[1]]
>>> list2
[[1]]
>>> list1[0][0] = 99
>>> list1
[[99]]
>>> list2
[[99]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...