print( sum(B)/len(B) )
Особенности копирования списков в Python
Вы уже знаете, что в языке Python массив хранится как
структура данных типа «список» (list). Предположим, что в
программе создан массив (список) A, например, так:
A = [1, 2, 3]
При этом фактически в переменной A хранится ссылка на спи-сок, то есть адрес этого списка в памяти. Оператор присваива-ния
B = A
копирует в переменную B тот же самый адрес. Теперь две пере-менные, A и B, будут ссылаться на один и тот же список (Рис. 3.10, а).
93 http://kpolyakov.spb.ru
A
[0, 2, 3]
A[0]= 0
[1, 2, 3]
05.04.2019 Информатика, 8 класс К.Ю. Поляков, Е.А. Еремин
б)
а)
а)
B B
Рис. 3.10.
Поэтому при изменении списка A будет одновременно изме-няться и список B, ведь фактически это один и тот же список, к которому можно обращаться по двум разным именам. На Рис. 3.10, б, показана ситуация после выполнения оператора A[0]=0.
Эту особенность Python нужно учитывать при работе со списками. Если нам нужна именно копия списка (а не ещё одна ссылка на него), можно использовать срез, включающий все элементы:
B = A[:]
Теперь А и B – это независимые списки, и изменение одного из них не меняет второй (Рис. 3.11).
а)
а)
[1, 2, 3]
а)
а)
а)
[1, 2, 3]
Рис. 3.11.
Вместо среза можно было вызвать функцию copy из моду-ля copy:
import copy
A = [1, 2, 3]
B = copy.copy(A)
Это так называемая «поверхностная» копия – она не созда-ёт полную копию, если список содержит какие-то изменяемые объекты, например, другие списки. Для полного копирования используется функция deepcopy из того же модуля:
import copy
A = [1, 2, 3]
B = copy.deepcopy(A)
94 http://kpolyakov.spb.ru
[0, 2, 3]
[1, 2, 3]
05.04.2019 Информатика, 8 класс К.Ю. Поляков, Е.А. Еремин
Поиск максимального элемента в массиве
Представьте себе, что вы по очереди заходите в N комнат, в каждой из которых лежит арбуз. Вес арбузов такой, что вы мо-жете унести только один арбуз. Возвращаться в ту комнату, где вы уже побывали, нельзя. Как выбрать самый большой арбуз?
Итак, вы вошли в первую комнату. По-видимому, нужно забрать лежащий в ней арбуз. Действительно, вдруг он самый большой? А вернуться сюда вы уже не сможете. С этим первым арбузом идёте во вторую комнату и сравниваете, какой арбуз больше – тот, который у вас в руках или новый. Если новый больше, берёте его, а старый оставляете во второй комнате. Те-перь в любом случае у вас в руках оказывается самый большой арбуз из первых двух комнат. Действуя так же и в остальных комнатах, вы гарантированно выберете самый большой арбуз из всех.
На этой идее основан и поиск максимального элемента в массиве. Для хранения максимального элемента выделим в памяти целочисленную переменную M. Будем в цикле просмат-ривать все элементы массива один за другим. Если очередной элемент массива больше, чем максимальный из предыдущих (находящийся в переменной M), запомним новое значение мак-
симального элемента в M.
Пусть требуется найти максимальное из значений элементов массива A, который имеет размер N. Чего не хватает в этом фрагменте программе:
for i in range(N):
if A[i] > M then
M = A[i] print( M )
Остается решить, каково должно быть начальное значение M.
Предположим, что в начале переменной M мы будем присваивать значение 0.
M = 0
95 http://kpolyakov.spb.ru
05.04.2019 Информатика, 8 класс К.Ю. Поляков, Е.А. Еремин
Всегда ли это будет правильно?
Во-первых, можно записать в переменную M значение, за-ведомо меньшее, чем значение любого из элементов массива. Например, если в массиве записаны натуральные числа, можно записать в M ноль.
Если же содержимое массива неизвестно, можно сразу за-писать в M значение A[0] (сразу взять первый арбуз), а цикл пе-ребора начать со второго по счёту элемента, A[1]:
M = A[0]
for i in range(1,N):
if A[i] > M:
Достарыңызбен бөлісу: |