В питоне, в чем разница между срезом со всем элементом и самим собой?

Я увидел следующую строку, и мне трудно понять, почему кто-то выразил это таким образом.

numbers = list(range(10))
numbers[:] = [n for n in numbers if n % 2 == 0]

Я попытался выполнить следующую строку, и это дает мне тот же результат.

numbers = [n for n in numbers if n % 2 == 0]

Я так понимаю, что [:] означает, что его массив со всеми элементами.

Какова цель попытки присвоить массиву полный элемент?


person ShinT    schedule 21.01.2020    source источник


Ответы (1)


numbers[:] = something называется назначением фрагмента. Он заменяет элементы в выбранном фрагменте (в данном случае весь массив) элементами справа от присваивания.

numbers = something — это обычное присваивание, при котором числа указывают на something.

Этот пример иллюстрирует различия:

numbers = [1, 2, 3]
something = [4, 5, 6]

numbers = something
something[0] = 10
print(numbers) # [10, 5, 6]

Обратите внимание, как мы хотели изменить список something, но неожиданно изменили numbers! Потому что они указывают на один и тот же список. Однако с назначением среза все обстоит иначе:

numbers = [1, 2, 3]
something = [4, 5, 6]

numbers[:] = something
something[0] = 10
print(numbers) # [4, 5, 6]

numbers все тот же.

Как указал пользователь Tomerikoo в комментариях, размер фрагмента не обязательно должен совпадать с тем, чем он заменяется. Это означает, что справедливо следующее:

numbers = [1, 2, 3]
numbers[:] = [4, 5, 6, 7, 8, 9] 
person Ismael Padilla    schedule 21.01.2020
comment
иллюстрированный пример чрезвычайно прост для понимания. присвоение переменной переменной в python - это обновление ссылки... поэтому, если я хочу назначить по значению, я должен использовать назначение среза... понял. спасибо за наглядный пример. - person ShinT; 22.01.2020
comment
стоит отметить, что размер something не обязательно должен совпадать с размером numbers (для второго случая) - person Tomerikoo; 22.01.2020
comment
@Tomerikoo правильно, я отредактирую свой ответ, так как некоторые люди могут счесть его вводящим в заблуждение - person Ismael Padilla; 22.01.2020
comment
Не обязательно вводит в заблуждение, ваш ответ совершенно прекрасен. Я просто подумал, что это небольшая деталь, о которой стоит упомянуть всем, кто добирается сюда :) отличный ответ! - person Tomerikoo; 22.01.2020