Comme je l'ai seulement maintenant remarqué après commentant cette réponse, tranches dans Python 3 retour peu profondes des copies de tout ce qu'ils sont de découpage plutôt que de vues. Pourquoi est-ce toujours le cas? Même en laissant de côté numpy l'utilisation de points de vue plutôt que de copies pour le tranchage, le fait qu' dict.keys
, dict.values
, et dict.items
tout retour de vues en Python 3, et qu'il y a de nombreux autres aspects de Python 3 orienté vers une plus grande utilisation des itérateurs, il semble qu'il y aurait eu un mouvement vers des tranches de devenir semblable. itertools
a un islice
fonction itérative tranches, mais c'est plus limité que la normale, de tranchage et de ne pas fournir des fonctionnalités d'affichage le long des lignes de dict.keys
ou dict.values
.
Ainsi, le fait que vous pouvez utiliser l'affectation à des tranches de modifier la liste d'origine, mais les tranches sont eux-mêmes des copies et pas les vues, est un aspect contradictoire de la langue et semble comme il viole plusieurs de ces principes illustrés dans le Zen de Python.
Qui est, le fait que vous pouvez faire
>>> a = [1, 2, 3, 4, 5]
>>> a[::2] = [0, 0, 0]
>>> a
[0, 2, 0, 4, 0]
Mais pas
>>> a = [1, 2, 3, 4, 5]
>>> a[::2][0] = 0
>>> a
[0, 2, 3, 4, 5]
ou quelque chose comme
>>> 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]
Semble quelque peu arbitraire/indésirable.
Je suis conscient de http://www.python.org/dev/peps/pep-3099/ et la partie où il est dit "des Tranches et des tranches étendues ne va pas loin (même si l' __getslice__
et __setslice__
Api peut être remplacé) et ils ne seront pas de retour de vues pour le standard de types d'objet.", mais les liées discussion prévoit pas de mentionner la raison pour laquelle la décision sur le découpage avec des vues a eu lieu; en effet, la majorité des commentaires sur cette suggestion spécifique de la liste de suggestions dans le post original semblait être positive.
Ce qui a empêché quelque chose comme cela, d'être mis en œuvre en Python 3.0, qui a été spécialement conçu pour ne pas être strictement vers l'arrière-compatible avec Python 2.x et donc aurait été le meilleur moment pour mettre en œuvre un tel changement dans la conception, et il n'y a rien qui peut l'empêcher dans les futures versions de Python?