You can write a list view type. Here is something I have written as experiment, it is by no means guaranteed to be complete or bug-free
class listview (object):
def __init__(self, data, start, end):
self.data = data
self.start, self.end = start, end
def __repr__(self):
return "<%s %s>" % (type(self).__name__, list(self))
def __len__(self):
return self.end - self.start
def __getitem__(self, idx):
if isinstance(idx, slice):
return [self[i] for i in xrange(*idx.indices(len(self)))]
if idx >= len(self):
raise IndexError
idx %= len(self)
return self.data[self.start+idx]
def __setitem__(self, idx, val):
if isinstance(idx, slice):
start, stop, stride = idx.indices(len(self))
for i, v in zip(xrange(start, stop, stride), val):
self[i] = v
return
if idx >= len(self):
raise IndexError(idx)
idx %= len(self)
self.data[self.start+idx] = val
L = range(10)
s = listview(L, 2, 5)
print L
print s
print len(s)
s[:] = range(3)
print s[:]
print L
Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<listview [2, 3, 4]>
3
[0, 1, 2]
[0, 1, 0, 1, 2, 5, 6, 7, 8, 9]
You may assign to indices in the listview, and it will reflect on the underlying list. However,it does not make sense to define append or similar actions on the listview. It may also break if the underlying list changes in length.