Я не могу ответить на почему; но он обязательно должен быть один, поэтому разные типы объектов могут быть очищены с помощью одного и того же интерфейса.
Очевидный простой пример:
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 [:]. Я думаю, что это легче реализовать для объектов, не похожих на список.