#!/usr/bin/env python
# coding: utf-8

# ### Урок 4.2: изменение списков

# In[1]:


import numpy as np
scores = np.array([3, 5, 7, 9, 8, 10])
pairs = scores.reshape(3, 2)


# В прошлом модуле мы довольно подробно посмотрели, как можно обращаться к элементам массива или даже к группе элементов, используя срезы, а сейчас мы посмотрим на то, каким образом элементы можно изменять. Возьмём массив `pairs` из предыдущего урока, который содержит оценки пар студентов:

# In[2]:


pairs


# Представим, что при внесении оценки первого студента мы ошиблись, и там на самом деле должна стоять оценка 3. Поправим: обратимся к этому элементу (это мы уже умеем делать), а далее присвоим ему новое значение:

# In[3]:


pairs[0][0] = 3
pairs


# Обратите внимание: у нас получилось изменить массив, не перезаписывая его полностью в переменную `pairs`, а только поправив один элемент. Это возможно, потому что массивы `NumPy` в Python – это изменяемые объекты. Изменяемость как раз и заключается в том, что мы можем изменить объект «как есть», не присваивая новый результат переменной с таким же названием. Это удобно, но иногда может вызывать проблемы. 
# 
# Представим, что мы хотим написать отчёт об ошибке в массиве `pairs` (ошибке в ведомости с оценками), и нам нужно предоставить старый массив и исправленный массив. Мы создаем массив `pairs2` и изменяем в нём значение первого элемента:

# In[4]:


pairs2 = pairs
pairs2[0][0] = 4
pairs2


# Если мы «скопировали» массив `pairs` в массив `pairs2` как в коде выше, через присваивание, нас будет ждать сюрприз:

# In[5]:


print(pairs)
print(pairs2)


# При изменении массива `pairs2`, массив `pairs` тоже изменился! Это тоже связано с тем, что массивы является изменяемыми объектами в Python. Поэтому, когда мы записываем что-то через присваивание (`=`), мы на самом деле создаем не новый объект, не копию, а просто ссылку на старый. Можно провести аналогию с созданием новой папки и ярлыка: при присваивании через `=` мы создаем «ярлык», просто ссылку на старый объект, а при непосредственном копировании мы создаем «папку», то есть новый объект. Копирование массива осуществляется с помощью метода `.copy()`:

# In[7]:


pairs3 = pairs2.copy()
pairs3[2][1] = 9
print(pairs2)
print(pairs3)


# Также скопировать массив можно, сделав его полный срез:

# In[ ]:


pairs4 = pairs3[:]
pairs4


# Посмотреть, насколько копия, созданная с помощью полного среза, является полноценной копией, и изменяется ли при её редактировании «оригинал», слушателям предлагается самостоятельно.

# Раз уже заговорили о срезах, давайте посмотрим, как изменить сразу несколько списков в массиве. Например, заменить в `pairs` первые два списка:

# In[8]:


pairs[0:2] = [[5, 4], [9, 7]]


# In[9]:


pairs


# На этом с изменением элементов массивов мы закончим, а в следующей части поговорим о создании новых массивов на основе старых с помощью генераторов списков и циклов.
