2015-02-18 4 views
6

Есть ли способ создать «срезное представление» последовательности в Python 3, которая ведет себя как обычный срез, но не создает копию нарезанной части последовательности? Когда исходная последовательность обновляется, «представление среза» должно отражать обновление.Python ломтик без копии?

>>> l = list(range(100)) 
>>> s = Slice(l, 1, 50, 3) # Should behave like l[1:50:3] 
>>> s[1] 
4 
>>> l[4] = 'foo' 
>>> s[1] # Should reflect the updated value 
'foo' 

я могу написать свой собственный Slice класс, который делает это, но я хотел бы узнать, есть ли встроенный способ.

+1

Связанный - http://stackoverflow.com/questions/3485475/can-i-create-a-view-on-a-python-list Не уверен, что что-то имеет приходить в но не голосование, чтобы закрыть как дубликат :-) –

+0

Не могли бы вы указать, какие ответы вы ожидаете, кроме предоставленных в связанном вопросе: пользовательский класс Slice, numpy, memoryview, generator (iterator)? – jfs

ответ

2

Использование isliceиз itertools библиотека

EDIT:

Я вижу, где я неправильно понял вопрос. Ну, такого нет. Если вы хотите создать свой класс, вы должны будете:

  1. Держите ссылку на исходный список в вас фрагмент класса
  2. Определить, __iter__, __getitem__ и __setitem__ методы для работы над исходным списком с конверсией индексов
+1

'islice' фактически не производит индексируемую последовательность - вам нужно материализовать итератор, после чего он больше не будет представлением в базовой последовательности, а скорее собственной последовательностью. –

Смежные вопросы