Ссылка на часть списка - Python

Если у меня есть список в python, как я могу создать ссылку на часть списка? Например:

myList = ["*", "*", "*",  "*", "*", "*", "*", "*", "*"]

listPart = myList[0:7:3] #This makes a new list, which is not what I want

myList[0] = "1"

listPart[0]

"1"

Возможно ли это, и если да, то как мне его закодировать?

Cheers, Джо

Ответ 2

Вы можете написать тип вида списка. Вот что я написал в качестве эксперимента, он ни в коем случае не гарантированно будет полным или без ошибок

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

Вывод:

[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]

Вы можете назначать индексы в списке, и он будет отражать основной список. Тем не менее, нет смысла определять append или подобные действия в listview. Он также может сломаться, если основной список изменяется по длине.

Ответ 3

В python ничего нет, что действительно делает то, что вы хотите. В основном вы хотите написать какой-то прокси-объект.

Ответ 4

Я думаю, что это невозможно. Это приведет ко многим возможным ошибкам, например: что, когда вы добавляете список, который ссылается на часть большего списка? Будет ли заменен следующий элемент в большом списке или вставлен?

Насколько я знаю, silce - это внутренний механизм для получения элементов списка. Они не создают новый объект списка, ссылаясь на части более старого объекта списка. Islice просто выполняет итерации над элементами, заданными срезом, это также не ссылка, но фактический объект - его изменение не влияет на исходный список. Или я ошибаюсь?

Как и в комментарии, и это решение действительно помогает г-ну Бастиену, вы можете сделать:

sliceobject = slice(0,7,3)
for i in xrange(sliceobject.start, sliceobject.stop, sliceobject.step)
    myList[i] = whatever

Таким образом, вы можете получить доступ к каждому указанному элементу списка по ссылке.