Python: путается с list.remove
Я очень новичок в Python, поэтому извините, наверное, за простой вопрос.
(Хотя, я провел 2 часа, чтобы найти ответ)
Я упростил свой код, чтобы проиллюстрировать проблему:
side=[5]
eva=side
print(str(side) + " side before")
print(str(eva) + " eva before")
eva.remove(5)
print(str(side) + " side after")
print(str(eva) + " eva after")
Это дает:
[5] side before
[5] eva before
[] side after
[] eva after
Почему команда remove также влияет на сторону списка? Что я могу сделать, чтобы использовать копию "стороны", не изменяя список?
Большое спасибо
Редактировать: Большое спасибо за хорошие и понятные ответы!
Ответы
Ответ 1
У Python есть "вещи" и "имена для вещей". Когда вы пишете
side = [5]
вы создаете новую вещь [5]
и даете ей имя side
. Когда вы пишете
eva = side
вы создадите новое имя для side
. Задания просто дают имена вещам! Осталось только одно [5]
с двумя разными именами.
Если вам нужна новая вещь, вам нужно просить ее явно. Обычно вы делаете copy.copy(thing)
, хотя в случае списков есть специальный синтаксис thing[:]
.
FYI "вещи" обычно называются "объектами"; "Имена" обычно называются "ссылками".
Ответ 2
eva
и side
относятся к тому же списку.
Если вы хотите иметь копию списка:
eva = side[:]
Подробнее о копировании списков вы можете прочитать в этой статье: Python: скопируйте список правильно
Изменить. Это не единственный способ скопировать списки. См. Ссылку, опубликованную в первом комментарии к этому ответу.
Ответ 3
Ответ dusan правильный, и это умный подход, но я думаю, что он нарушает руководство Zen of Python, что "Явное лучше, чем неявное".
Более распространенный шаблон, который я видел, чтобы гарантировать, что элемент является глубоким, - это модуль copy
.
>>> import copy
>>> eva = copy.copy(side)