Tan pronto como usted tomar una rebanada de una lista, que será la creación de una nueva lista. De acuerdo, contendrá los mismos objetos, por lo que siempre y cuando se trate de objetos de la lista, sería lo mismo, pero si modifica un sector, la lista original no se modifica.
Si realmente desea crear una vista modificable, se podría imaginar una nueva clase basada en collection.MutableSequence
Esto podría ser un punto de partida para una lista de sub ofrecido completo - se procesa correctamente los índices de división, pero al menos es carente de especificación para el procesamiento de índices negativos:
class Sublist(collections.MutableSequence):
def __init__(self, ls, beg, end):
self.ls = ls
self.beg = beg
self.end = end
def __getitem__(self, i):
self._valid(i)
return self.ls[self._newindex(i)]
def __delitem__(self, i):
self._valid(i)
del self.ls[self._newindex(i)]
def insert(self, i, x):
self._valid(i)
self.ls.insert(i+ self.beg, x)
def __len__(self):
return self.end - self.beg
def __setitem__(self, i, x):
self.ls[self._newindex(i)] = x
def _valid(self, i):
if isinstance(i, slice):
self._valid(i.start)
self._valid(i.stop)
elif isinstance(i, int):
if i<0 or i>=self.__len__():
raise IndexError()
else:
raise TypeError()
def _newindex(self, i):
if isinstance(i, slice):
return slice(self.beg + i.start, self.beg + i.stop, i.step)
else:
return i + self.beg
Ejemplo:
>>> a = list(range(10))
>>> s = Sublist(a, 3, 8)
>>> s[2:4]
[5, 6]
>>> s[2] = 15
>>> a
[0, 1, 2, 3, 4, 15, 6, 7, 8, 9]
Para cualquiera que se encuentre con esta pregunta como yo, [memoryview] (https://docs.python.org/2/library/stdtypes.html#memoryview) ahora ofrece esta capacidad. – robert
@robert ¿Cómo? La 'memoryview' solo funciona para objetos con interfaz de búfer y la lista no es uno de ellos. – zegkljan
En el ejemplo proporcionado aquí, debe usar un 'bytearray' en lugar de una lista. También puede envolver la lista en 'bytearray'. – robert