Как я только сейчас заметил после комментирования этого ответа , фрагменты в Python 3 возвращают мелкие копии того, что они нарезают, а не представления. Почему это все еще так? Даже оставляя в стороне использование представлений numpy, а не копий для нарезки, тот факт, что dict.keys
, dict.values
и dict.items
все возвращают представления в Python 3, и что есть много других аспектов Python 3, ориентированных на более широкое использование Итераторы создают впечатление, что было бы движение к тому, чтобы срезы становились похожими. У itertools
есть функция islice
, которая создает итеративные срезы, но она более ограничена, чем обычные срезы, и не обеспечивает функциональные возможности просмотра вдоль линий dict.keys
или dict.values
.
Кроме того, тот факт, что вы можете использовать присваивание срезами для изменения исходного списка, но срезы сами являются копиями, а не представлениями, является противоречивым аспектом языка и, похоже, нарушает несколько принципов, проиллюстрированных в Дзен Питона .
То есть факт, что вы можете сделать
>>> 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?