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)