Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

Зачем в Python 3.3 ввели list.copy() если можно использовать слайс без указания границ?

Сейчас плотно изучаю нюансы методов встроенных типов, и есть один вопрос, на который не могу найти ответ.
В Python 3.3 ввели метод списка copy(), который делает поверхностную копию. Но то же самое можно было делать, просто взяв срез без границ - list[:]
Зачем было вводить новый метод?
Подозреваю, что какая-то причина есть. Например, сначала я считал таким же ненужным нововведением метод list.clear(), введённый в том же Python 3.3, ведь есть же list = []
А потом я прочитал, что эти две синтаксические конструкции по разному работают в ситуациях, когда на список ссылаются две или более переменных.
Подозреваю, что и для copy() существует такое же очевидное задним числом обоснование, но найти его пока не смог.


Ответ

Чтобы сделать операции del list_[:] и shallow_copy = list_[:] более очевидными (discoverable) и читаемыми для новичков (list_.clear() и shallow_copy = list_.copy() соответственно). See Add list.clear() and list.copy()
В целом, в Питоне есть предпочтение к использованию слов вместо пунктуации, например: and, or вместо &&, || или on_true if cond else on_false вместо cond ? on_true : on_false или re.search(regex) вместо /regex/
Дополнительно, наличие явного метода list_.clear() может уменьшить вероятность возможной ошибки:list_ = [] существенно отличается от del list_[:] (первая конструкция создаёт новый список и привязывает его к имени list_, вторая конструкция удаляет все элементы из существующего объекта (изменяемой последовательности такой как список наиболее вероятно)).
Недостаток, что эти методы дублируют функциональность изменяемых последовательностей/отображений (объекты с __getitem__, __delitem__ методами).

Комментариев нет:

Отправить комментарий