sequence[i:j] = iterable
iterable
- любой объект поддерживающий итерациюsequence
- изменяемая последовательность, list
или bytearray
,i
и j
- целые числаОперация sequence[i:j] = iterable
позволяет заменить элементы последовательности по указанному срезу содержимым итерации.
В результате, указанный срез последовательности sequence
от индекса i
до индекса j
заменяется содержимым итерации iterable
. Операция замены по срезу дополнит последовательность содержимым итерации, в случае если j - i < len(iterable)
или наоборот уменьшит, если `j - i > len(iterable).
Больше об индексации среза читайте в операции получения среза последовательности и смотрите встроенную функцию slice()
Эта операция поддерживаются изменяемыми типами последовательностей.
Пояснение по ключевой фразе - заменяется содержимым итерации iterable
:
Если размер среза меньше размера итерации j - i < len(iterable)
, то произойдет замена указанных в срезе элементов последовательности sequence
, а избыточные элементы итерации iterable
дополнят последовательность с индекса j
на размер len(iterable) - (j - i)
. Другими словами длина последовательности sequence
станет больше.
Если размер среза больше размера итерации j - i < len(iterable)
, то указанный срез последовательности sequence
замениться меньшим количеством элементов итерации iterable
. Другими словами длина последовательности sequence
станет меньше на j - i - len(iterable)
.
Если индекс j
указанного среза выходит за пределы индексации последовательности j > len(sequence)
, то в результате произойдет замена элементов последовательности sequence
от индекса i
до конца частью содержимого итерации iterable
, а оставшиеся элементы iterable
расширят последовательность sequence
.
Если оба индекса указанного среза i > len(sequence)
и j > len(sequence)
- выходят за пределы индексов последовательности, то в результате операции произойдет расширение последовательности sequence
содержимым итерации iterable
. То есть произойдет сложение двух последовательностей sequence
и iterable
.
Если индексы указанного среза i
и j
опущены, то в результате операции произойдет замена последовательности sequence
содержимым итерации iterable
.
Важно. При изменении последовательности срезом с заданным шагом все происходит немного иначе.
Информация по встроенной функции len()
>>> x = [1, 4, 7, 10, 13, 16, 19] >>> x[1:4] = [0, 0, 0] >>> x # [1, 0, 0, 0, 13, 16, 19] >>> x[3:6] = ['one', 'two', 'three'] >>> x # [1, 0, 0, 'one', 'two', 'three', 19] >>> x[3:6] = 'one' >>> x # [1, 0, 0, 'o', 'n', 'e', 19] # Вставляем не итерируемый объект >>> x[3:6] = 20.2 # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # TypeError: can only assign an iterable # Вставляем список меньшего размера чем срез >>> x[1:6] = ['foo', 'moo'] >>> x # [1, 'foo', 'moo', 19] # Вставляем список большего размера чем срез >>> x[0:2] = [12, 15, 18, 111, 141, 171] >>> x # [12, 15, 18, 111, 141, 171, 'moo', 19] >>> x = [1, 4, 7, 10, 13, 16, 19] # индекс j выходит за пределы последовательности >>> x[5:20] = ['one', 'two', 'three', 'four'] >>> x # [1, 4, 7, 10, 13, 'one', 'two', 'three', 'four'] # Cрез выходит за пределы последовательности >>> x[20:] = ['one', 'two', 'three'] >>> x # [1, 4, 7, 10, 13, 'one', 'two', 'three', 'four', 'one', 'two', 'three'] # Индексы опущены, произойдет замена >>> x[:] = ['one', 'two', 'three'] >>> x # ['one', 'two', 'three'] # Вложенные последовательности >>> x = [[1, 4, 7, 10], [13, 16, 19]] >>> x[0][1:4] = ['one', 'two', 'three'] >>> x # [[1, 'one', 'two', 'three'], [13, 16, 19]]