a_list = ['foo', 'bar']
Создает новый list
в памяти и указывает на него имя a_list
. Неважно, на что a_list
указывал раньше.
a_list[:] = ['foo', 'bar']
Вызывает метод __setitem__
объекта a_list
с slice
в качестве индекса и новый list
, созданный в памяти, в качестве значения.
__setitem__
оценивает slice
, чтобы выяснить, какие индексы он представляет, и вызывает iter
для переданного значения. Затем он выполняет итерацию по объекту, устанавливая каждый индекс в диапазоне, указанном slice
, на следующее значение из объекта. Для list
s, если диапазон, указанный slice
, не имеет той же длины, что и итерируемый, размер list
изменяется. Это позволяет вам делать ряд интересных вещей, например удалять разделы списка:
a_list[:] = [] # deletes all the items in the list, equivalent to 'del a_list[:]'
или вставка новых значений в середину списка:
a_list[1:1] = [1, 2, 3] # inserts the new values at index 1 in the list
Однако с «расширенными срезами», где step
не равно единице, итерация должна быть правильной длины:
>>> lst = [1, 2, 3]
>>> lst[::2] = []
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: attempt to assign sequence of size 0 to extended slice of size 2
Основные отличия в назначении фрагмента a_list
:
a_list
уже должен указывать на объект
- Этот объект изменен, вместо того, чтобы указывать
a_list
на новый объект
- Этот объект должен поддерживать
__setitem__
с индексом slice
.
- Объект справа должен поддерживать итерацию
- На объект справа не указано имя. Если на него нет других ссылок (например, когда это литерал, как в вашем примере), он будет считаться несуществующим после завершения итерации.
person
agf
schedule
14.04.2012