TypeError: 'str' object does not support item assignment
```
```py
>>> ss1=ss1[:4]+'='+ss1[5:]
>>> ss1
'Это = строка символов'
>>> ss1b = ss1b[:13] + 'Ivanov I.I.'; ss1b
>>> print(ss1b)
Меня зовут
Ivanov I.I.
```
Создадим еще несколько объектов разных типов данных
```py
>>> a = 10; a; type(a)
10
<class'int'>
>>> a = 1.14; a; type(a)
1.14
<class'float'>
>>> a = True; a; type(a)
True
<class'bool'>
>>> a = 4 + 2j; a; type(a)
(4+2j)
<class'complex'>
>>> a = complex(4,2); a; type(a)
(4+2j)
<class'complex'>
>>> a = 'Hello, World!'; a; type(a)
'Hello, World!'
<class'str'>
```
## 8 Более сложные типы объектов
### 8.1 Списки
#### 8.1.1 Индексы и срезы
```py
>>> spis1=[111,'Spisok',5-9j]; spis1
[111, 'Spisok', (5-9j)]
>>> stup=[0,0,1,1,1,1,1,1,1]; stup
[0, 0, 1, 1, 1, 1, 1, 1, 1]
>>> spis = [1,2,3,4,
5,6,7,
8,9,10]; spis
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> spis[-1]
10
>>> stup[-8::2]
[0, 1, 1, 1]
```
В последнем случае получилось, что, в результате среза исходного списка stup длиной в 9 элементов, мы получили список длиной в 4 элемента. Это можно объянсить так: так как в срезе мы указали, что выборка элементов (срез) будет происходить от 8-го элемента с конца (т.к. знак минус перед 8) и до посленего элемента. Так как шаг был указан равным 2, то получаем: 8 / 2 = 4 элемента войдут в новый список.
```py
>>> spis1[1]='Список'; spis1
[111, 'Список', (5-9j)]
```
#### 8.1.2 Методы списков
Все методы списка spis1 можно увидеть камандой dir (они, методы, без двойных нижних подчеркиваний):
extend(iterable, /) method of builtins.list instance
Extend list by appending elements from the iterable.
>>> ls.extend([3,4,5,6])
>>> ls
[1, 3, 4, 5, 2, 3, 4, 5, 6]
>>> ls.extend([3,4,5,6]); ls
[1, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6]
>>> help(ls.clear)
Help on built-in function clear:
clear() method of builtins.list instance
Remove all items from list.
>>> ls.clear(); ls
[]
>>> ls = [1,2,5,4,7,6,9]
>>> ls.sort(); ls
[1, 2, 4, 5, 6, 7, 9]
>>> ls.sort(reverse = True); ls
[9, 7, 6, 5, 4, 2, 1]
>>> a = ['aa','aaa','a','aaaa', 'bb']
>>> a.sort(key = len); a
['a', 'aa', 'bb', 'aaa', 'aaaa']
>>> ls; ls.reverse(); ls
[9, 7, 6, 5, 4, 2, 1]
[1, 2, 4, 5, 6, 7, 9]
>>> help(ls.copy)
Help on built-in function copy:
copy() method of builtins.list instance
Return a shallow copy of the list.
```
Shallow copy - поверхностная копия. При таком копировании любые сложные объекты исходного списка копируются (передаются) в новый список по ссылке. Это значит, что изменение такого скопированного объекта в копии приведет к изменению этого же объекта в исходнои списке. Такими сложными объектами могут являться, например, вложенные списки.
```py
>>> spis2 = [[1,2], [3,4],5,6,7]
>>> cp = spis2.copy()
>>> cp
[[1, 2], [3, 4], 5, 6, 7]
>>> cp[0][0] = 100; cp[3] = 200
>>> spis2; cp
[[100, 2], [3, 4], 5, 6, 7]
[[100, 2], [3, 4], 5, 200, 7]
```
Можно заметить, что при изменении в cp (копии) части вложенного списка, изменения затронули и исходный список spis2. А вот изменение простого объекта - целочисленной переменной, имеющей значение 6, на значение 200, - не повлекло за собой изменения в исходном списке.
```py
>>> help(spis2.count)
Help on built-in function count:
count(value, /) method of builtins.list instance
Return number of occurrences of value.
>>> a = [1,2,2,3,3,3,4,4,4,4]
>>> a.count(1); a.count(2); a.count(4)
1
2
4
>>> help(ls.index)
Help on built-in function index:
index(value, start=0, stop=9223372036854775807, /) method of builtins.list instance
Заметим, что при изменении spis2[0][1] = 78, касающегося на первый взгляд только списка spis2, изменился и список spis1, который является составной чатсью (а имеено первым элементом) списка spis2. Это происходит потому, что имя списка - это переменная, указывающая на адрес списка (точнее: на адрес его первого элемента). Поэтому справедливо сказать, что записью spis2=[spis1,[4,5,6,7]] мы в качестве первого элемента списка spis2 передаем не просто какую-то копию списка spis1, а передаем адрес его (spis1) первого элемента. Такая передача называется передача по сслыке. Именно поэтому изменение первого элемента списка spis2 влечет за собой изменение не только в самом spis2, но и в его первом элементе - списке spis1.
Предпоследняя операция выводит словарь, число элеиментов которого равно пяти. Количество элементов имеено пять, а не семь, потому, что функция zip объединяет два объекта (в нашем случае кортеж с ключами и массив со значениями). Так как кортеж содержит семь элементов, а массив - пять, то функция zip сделает из двух этих объектов кортеж из пяти элементов. Никакого "зацикливания" не будет.
Заметим, что логическое значение True, при создании сножества, воспринимается как 1. Поэтому ниже можно заметить, что значение True не вошло в множество, так как есть 1.