У 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 issue38557 ).