Как я заметил только после комментирования этого ответа, фрагменты в Python 3 возвращают мелкие копии того, что они нарезают, а не виды. Почему это так? Даже оставляя в стороне избыточное использование представлений, а не копий для разрезания, факт, что dict.keys
, dict.values
и dict.items
все возвращают представления в Python 3 и что существует много других аспектов Python 3, направленных на более широкое использование итераторам, кажется, что было бы движение к тому, чтобы срезы стали похожими. itertools
имеет функцию islice
, которая делает итеративные срезы, но которая более ограничена, чем обычная нарезка, и не предоставляет функции представления по линиям dict.keys
или dict.values
.
Кроме того, тот факт, что вы можете использовать назначение срезам для изменения исходного списка, но сами фрагменты являются копиями, а не представлениями, является противоречивым аспектом языка и, похоже, нарушает некоторые из принципов, проиллюстрированных в Zen of Python.
То есть, вы можете сделать
>>> a = [1, 2, 3, 4, 5]
>>> a[::2] = [0, 0, 0]
>>> a
[0, 2, 0, 4, 0]
Но не
>>> a = [1, 2, 3, 4, 5]
>>> a[::2][0] = 0
>>> a
[0, 2, 3, 4, 5]
или что-то вроде
>>> a = [1, 2, 3, 4, 5]
>>> b = a[::2]
>>> b
view(a[::2] -> [1, 3, 5]) # numpy doesn't explicitly state that its slices are views, but it would probably be a good idea to do it in some way for regular Python
>>> b[0] = 0
>>> b
view(a[::2] -> [0, 3, 5])
>>> a
[0, 2, 3, 4, 5]
Кажется несколько произвольным/нежелательным.
Я знаю http://www.python.org/dev/peps/pep-3099/ и ту часть, где говорится: "Ломтики и расширенные срезы не исчезнут (даже если могут быть заменены API-интерфейсы __getslice__
и __setslice__
), а также не будут возвращать представления для стандартных типов объектов.", но связанное обсуждение не дает упоминания о том, почему было принято решение о разрезании с представлениями; на самом деле большинство комментариев по этому конкретному предложению из предложений, перечисленных в первоначальном сообщении, казалось, были положительными.
Что помешало реализовать что-то подобное в Python 3.0, которое было специально разработано, чтобы не быть строго совместимым с Python 2.x и, таким образом, было бы лучшим временем для реализации такого изменения дизайна, и есть ли все, что может помешать ему в будущих версиях Python?