Подтвердить что ты не робот

Почему в python нет метода list.clear()?

Вдохновленный этот вопрос.

Почему в python нет метода list.clear()? Я нашел здесь несколько вопросов, которые говорят, что правильный способ сделать это - одно из следующего, но никто не сказал, почему существует не просто метод для него.

del lst[:]
lst[:] = []

Хотя это может противоречить "zen of python", чтобы иметь несколько способов сделать что-то, мне кажется, что мне кажется более очевидным метод "list.clear()". Он также попадает в соответствие с dicts и set, оба из которых имеют .clear().

Я наткнулся на несколько сообщений на идеи python-dev и python по этому поводу и не пришел к окончательному ответу (см. здесь (2006) и здесь (2009)). На него положил Гвидо? Это всего лишь точка раздора, которая еще не разрешена за последние 4-5 лет?

Обновление: list.clear() добавлено в python в 3.3 - см. здесь

4b9b3361

Ответ 1

В потоках, которые вы связали Раймонд Хеттингер в значительной степени подводит итоги за и против добавления этого метода. Когда дело доходит до дизайна языка, очень важно быть консервативным. См. Например, "каждая функция начинается с -100 пунктов" , которую имеет команда С#. Вы не получаете что-то столь же чистое, как Python, добавляя функции волей-неволей. Просто взгляните на некоторые из наиболее жестоких популярных языков сценариев, чтобы увидеть, где он вас принимает.

Я думаю, что метод .clear() никогда не пересекал неявное правило точек -100, чтобы стать чем-то, что стоит добавить к основному языку. Несмотря на то, что имя метода уже используется для эквивалентной цели, и альтернативу может быть трудно найти, вероятно, это далеко не все, что далеко от него.

Ответ 2

Пока этот вопрос не задавался, в этом случае 3.3 имеет один (как указано в http://bugs.python.org/issue10516). Кроме того, были добавлены методы bytearray и MutableSequence, чтобы облегчить переключение между списками и другими коллекциями (set, dict и т.д.).

Подробные сведения об изменении можно найти здесь.

Ответ 3

Я не могу ответить на вопрос почему; но там абсолютно должно быть одно, поэтому различные типы объектов могут быть очищены одним и тем же интерфейсом.

Очевидный простой пример:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()

Это требует, чтобы объект поддерживал итерацию и поддерживал clear(). Если в списках был метод clear(), это могло бы принять список или установить одинаково. Вместо этого, поскольку наборы и списки имеют разные API для удаления их содержимого, это не работает; вы в конечном итоге с ненужным уродливым взломом, например:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    if getattr(reqs, "clear"):
        reqs.clear()
    else:
        del reqs[:]

Насколько мне известно, использование del obj [:] или obj [:] = [] - это просто неприятные, неинтуитивные хаки, чтобы обойти тот факт, что в списке отсутствует clear().

Это приводит к "уменьшению избыточности" к ошибке, где это наносит ущерб согласованности языка, что еще более важно.

Что касается использования, я бы рекомендовал del obj [:]. Я считаю, что это проще для объектов, не связанных с списком.

Ответ 4

При тестировании часто бывает полезно настроить данные, формирующие домен тестов в глобальных переменных, чтобы тесты могли строить друг на друге, если это необходимо/проще. В таких случаях наличие метода очистки списка позволит вам сделать это без необходимости объявлять эти переменные глобальными в пределах функции (например, тестов). Я знаю, тесты не должны зависеть друг от друга...

Ответ 5

Возникает вопрос, почему clear было сочтено необходимым в первую очередь. Следующее работает, чтобы очистить любую коллекцию Python, о которой я могу думать.

def clear(x):
    return type(x)()

>>> s = {1, 2, 3}
>>> s
set([1, 2, 3])
>>> s = clear(s)
>>> s
set([])
>>> l = [1, 2, 3]
>>> l
[1, 2, 3]
>>> l = clear(l)
>>> l
[]