В Python (2 и 3). Всякий раз, когда мы используем нарезку списка, он возвращает новый объект, например:
l1 = [1,2,3,4]
print(id(l1))
l2 = l1[:]
print(id(l2))
Вывод
>>> 140344378384464
>>> 140344378387272
Если то же самое повторяется с кортежем, возвращается тот же объект, например:
t1 = (1,2,3,4)
t2 = t1[:]
print(id(t1))
print(id(t2))
Вывод
>>> 140344379214896
>>> 140344379214896
Было бы замечательно, если бы кто-то мог пролить свет на то, почему это происходит, на протяжении всего моего опыта с Python у меня было впечатление, что пустой фрагмент возвращает новый объект.
Насколько я понимаю, он возвращает тот же объект, поскольку кортежи неизменны, и нет смысла создавать его новую копию. Но опять же, это нигде не упоминается в документах.
l2 = tuple(iter(l1))
обходит оптимизацию
PyTuple_GetSlice
был задокументирован неточно после просмотра вашего вопроса. Документы теперь исправлены (это была проблема bpo 38557 ).