Задать вопрос
@Shpindel_t_800

Как это [:] это работает?

Привет! Не могу разобраться как работает оператор [:]. Я знаю что он делает копию списка и возвращает ее, при этом записывает данные уже в другую ячейку памяти.
a = [1, 2, 3, 4, 5]
b = a
a = [1, 2, 3]
print(a, b)

В коде переменная "a" поменяет значение, "b" останется прежней, так как до сих ссылается на первый список. Про сслыки вместо переменных я читал. Но вот например в следующем коде:
a = [1, 2, 3, 4, 5]
b = a
a[:] = [4, 5 ,6 ,7 ,8 , 9]
print(a, b)
#a и b равны [4, 5 ,6 ,7 ,8 , 9]

Не понимаю механику, ведь мы срезом просто берем копию списка, как переменная "b" начала ссылаться на новый список?
Я взял id() от переменных:
a = [1, 2, 3, 4, 5]
b = a
print(id(a))#140686224235392 до объявления среза
a[:] = [4, 5 ,6 ,7 ,8 , 9]
print(id(a[:]))#140695459003648 адрес копии списка
print(id(a), id(b))#140683718712192 140683718712192 адреса не поменялись

Адрес переменной 'a' остается неизменным после взятия среза a[:] и присваиванию ему нового значения, однако id() самого среза другой. Не могу понять как мы присвоив копии списка a[:] новое значение, поменяли объект на который ссылаются переменные a и b. Подскажите в чем магия? :)
  • Вопрос задан
  • 1563 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
fenrir1121
@fenrir1121
Начни с документации
Для начала замечу, что для сравнения есть два замечательных оператора == и is
Первый проверяет равенство, тогда как второй идентичность
a = [1, 2, 3]
b = a
print(a == b)  #True
print(a is b)  #True

a = [1, 2, 3]
b = list(a)
print(a == b)  #True
print(a is b)  #False


Теперь что касается среза он дает доступ к диапазону коллекции, в случае с [:] всему диапазону. Он создает объект, а затем вставляет ссылки на объекты из оригинала. Это можно легко посмотреть добавив дочерние элементы, ссылки на них останутся старые и при изменении они изменятся в обоих списках
original_lst = [1, 2, [3, 4]]
lst = original_lst[:]
lst[2][1] = 5
print(original_lst[2] is lst[2])  #True
print(original_lst) #[1, 2, [3, 5]]


Чтобы создать полностью независимый объект стоит использовать модуль copy
from copy import deepcopy
original_lst = [1, 2, [3, 4]]
lst = deepcopy(original_lst)
lst[2][1] = 5
print(original_lst[2] is lst[2])  #False
print(original_lst)  #[1, 2, [3, 4]]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы