Как str.join
работает (из анализа исходного кода)
Сначала он проверяет, является ли объект итеративным, и создает последовательность из него, если это необходимо
seq = PySequence_Fast(iterable, "can only join an iterable");
Если объект является list
или tuple
, он просто возвращает сам объект, итерировать не нужно.
Если это не так, то выполняется итерация для создания list
. Вот где объект полностью повторяется.
Оттуда используется только копия list
. iterable
был повторен и теперь бесполезен, если это не было list
или tuple
.
(Я не мог отследить вызов до len
, потребовался бы сеанс отладки, чтобы найти его в вызове PySequence_Fast
, но это кажется бесполезным. У вашей итерации есть метод __len__
, хорошо, но так как это не list
или tuple
, возвращаемое значение не используется)