Запрет изменения списка в функции

We use cookies. Read the Privacy and Cookie Policy

Иногда требуется предотвратить изменение списка в функции. Допустим, у вас имеется список моделей для печати, и вы пишете функцию для перемещения их в список готовых моделей, как в предыдущем примере. Возможно, даже после печати всех моделей исходный список нужно оставить для отчетности. Но, ­поскольку все имена моделей были перенесены из списка unprinted_designs, остался только пустой список; исходная версия списка потеряна. Проблему можно решить передачей функции копии списка вместо оригинала. В этом случае все изменения, вносимые функцией в список, будут распространяться только на копию, а оригинал списка остается неизменным.

Чтобы передать функции копию списка, можно поступить так:

имя_функции(имя_списка[:])

Синтаксис среза [:] создает копию списка для передачи функции. Если удаление элементов из списка unprinted_designs в print_models.py нежелательно, функцию print_models() можно вызвать так:

print_models(unprinted_designs[:], completed_models)

Функция print_models() может выполнить свою работу, потому что она все равно получает имена всех ненапечатаных моделей. Но на этот раз она получает не сам список unprinted_designs, а его копию. Список completed_models заполняется именами напечатанных моделей, как и в предыдущем случае, но исходный список функцией не изменяется.

Несмотря на то что передача копии позволяет сохранить содержимое списка, обычно функциям следует передавать исходный список (если у вас нет веских причин для передачи копии). Работа с существующим списком более эффективна, потому что программе не приходится тратить время и память на создание отдельной копии (лишние затраты особенно заметны при работе с большими списками).

Упражнения

8-9. Фокусники: создайте список с именами фокусников. Передайте список функции show_magicians(), которая выводит имя каждого фокусника в списке.

8-10. Великие фокусники: начните с копии вашей программы из упражнения 8-9. Напишите функцию make_great(), которая изменяет список фокусников, добавляя к имени каждого фокусника приставку «Great». Вызовите функцию show_magicians() и убедитесь в том, что список был успешно изменен.

8-11. Фокусники без изменений: начните с программы из упражнения 8-10. Вызовите функцию make_great() и передайте ей копию списка имен фокусников. Поскольку исходный список остался неизменным, верните новый список и сохраните его в отдельном списке. Вызовите функцию show_magicians() с каждым списком, чтобы показать, что в одном списке остались исходные имена, а в другом к имени каждого фокусника добавилась приставка «Great».