Новый список создается путем разрезания старого списка; модифицировать «новые» изменения «старые», а? - PullRequest
0 голосов
/ 04 сентября 2018

Сводка: Я создал новую переменную списка, взяв оригинальную часть. Когда я настраиваю новый список, предыдущий тоже меняется, но я уверен, что это два разных списка! Вот мой общий метод:

1.Создать начальный список all_info, вызвав функцию. Каждый элемент списка представляет собой список из 5 элементов.

all_info = CrossReference(start_info, RBS_info, promoter_info)

2.Создайте новый список all_info_mod, нарезав начальный список, чтобы удалить первый элемент (мне нужно сделать это для последующего кода). Затем подтвердите, что они различны.

all_info_mod = all_info[1:]

all_info #Shows original list
all_info_mod #Shows sliced list

3. Поместите первые 3 элемента каждого внешнего списка в 1. Затем проверьте.

for i in all_info_mod:
    for j in range(0, 3):
        i[j] += 1

all_info_mod #Successfully altered
all_info #Also altered?!

Первоначальный список также изменяется, когда он не должен быть. Я протестировал на более простых примерах и получил тот же результат. Возможно, это результат моего предыдущего кода, который предшествует этому? (Может предоставить более подробную информацию, если это необходимо).

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Это происходит потому, что вы изменяете изменяемые объекты, ссылки на которые в обоих списках. Изменение нарезанного списка не приведет к изменению среза, но изменение изменяемого объекта в этом списке также будет видно из другого списка, поскольку оба списка содержат один и тот же объект.

list_ = [[1, 2, 3], [4, 5, 6]]
slice_ = list_[:]
list_[0] = [7, 8, 9]
print(slice_)
# [[1, 2, 3], [4, 5, 6]]

list_[1].append(0)
print(slice_[1])
# [4, 5, 6, 0]

print(list_[1] is slice_[1])  # The two lists both contain the same list object
# True
0 голосов
/ 04 сентября 2018

Когда вы делаете это:

all_info = [[1,2,3], [2,3,4], [5,6,7]]
all_info_mod = all_info[1:]

Вы выполняете нарезку на all_info, чтобы создать новый список all_info_mod. Проблема в том, что элементы all_info являются (ссылками на) списками, поэтому all_info_mod будет содержать копию ссылок на списки. Ссылки копируются, поэтому в конце оба списка содержат ссылки на одни и те же списки.
Это объясняет, почему при изменении списков, на которые ссылаются элементы all_info_mod, вы также изменяете списки, на которые ссылаются элементы all_info.

Обратите внимание, что если вы непосредственно измените элемент all_info_mod путем присвоения, т. Е. Если вы замените ссылку на список другой, то all_info не изменится:

all_info_mod[1] = [9,9,9]
print(all_info)      # [[1, 2, 3], [2, 3, 4], [5, 6, 7]]
print(all_info_mod)  # [[2, 3, 4], [9, 9, 9]]

Если вы действительно хотите дублировать данные в другом списке, вы должны использовать метод copy.deepcopy () , как показано ниже:

import copy
all_info = ...
all_info_mod = copy.deepcopy(all_info[1:])
0 голосов
/ 04 сентября 2018

Вам следует импортировать модуль copy и создать deepcopy, если вы не хотите вносить изменения в исходный список.

import copy

all_info_mod = copy.deepcopy(all_info[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...