Первый только создает другое имя для списка. Это все тот же список.
Это означает, что мутирует newlist
, также мутирует mylist
.
>>> mylist = [1, 2, 3]
>>> newlist = mylist
>>> newlist.append(4)
>>> mylist
[1, 2, 3, 4]
Во втором примере создается копия списка, фактически новый список.
>>> mylist = [1, 2, 3]
>>> newlist = mylist[:]
>>> newlist.append(4)
>>> newlist
[1, 2, 3, 4]
>>> mylist
[1, 2, 3]
У вас мало причин иметь два имени для одного и того же объекта, так как это может сбить с толку и привести к ошибкам мутации.
Ошибка мутации - это когда в какой-то части вашего кода требуется какой-то объект, скажем, функция func1
, но предварительно мутировавший в какой-то другой части вашего кода, например, в функцию func2
. Если объект в его начальном состоянии ожидался func1
, может быть очень утомительно отслеживать, где произошла мутация.
Пример:
obj = [list of data]
same_obj = obj
func2(same_obj) # mutates the object
# hundreds of lines of code
func1(obj) # needs the initial state of the object
В приведенном выше примере было бы лучше передать func2
копию obj
. Поскольку многое происходит между первой и последней строками, отследить ошибку мутации может быть очень утомительно.