जैसे ही आप एक सूची से एक टुकड़ा ले जाएगा, तो आप एक नई सूची बनाने की जाएगी। ठीक है, इसमें वही ऑब्जेक्ट्स होंगे जब तक कि सूची की ऑब्जेक्ट्स संबंधित हों, लेकिन यदि आप स्लाइस को संशोधित करते हैं तो मूल सूची अपरिवर्तित होती है।
तुम सच में एक परिवर्तनीय दृश्य बनाना चाहते हैं, तो आप एक नया collection.MutableSequence
के आधार पर वर्ग कल्पना कर सकता यह एक पूर्ण विशेषताओं उप सूची के लिए एक प्रारंभिक बिंदु हो सकता है - यह सही ढंग से टुकड़ा अनुक्रमित प्रोसेस करता है, लेकिन कम से कम है नकारात्मक अनुक्रमित प्रसंस्करण के लिए कमी विनिर्देश:
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
उदाहरण:
>>> 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]
किसी भी व्यक्ति के लिए जो इस प्रश्न में आया है, [स्मृतिदृश्य] (https://docs.python.org/2/library/stdtypes.html#memoryview) अब यह क्षमता प्रदान करता है। – robert
@robert कैसे? 'मेमोरीव्यू' केवल बफर इंटरफेस वाली वस्तुओं के लिए काम करता है और सूची उनमें से एक नहीं है। – zegkljan
यहां प्रदान किए गए उदाहरण में आपको सूची के बजाय 'bytearray' का उपयोग करना चाहिए। आप सूची को 'bytearray' में भी लपेट सकते हैं। – robert