2009-11-24 53 views
11

如果我在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" 

這是可能的,如果是的話,我將如何編碼?

乾杯, 喬

+0

另請參閱http://stackoverflow.com/questions/3485475/can-i-create-a-view-on-a-python-list –

回答

1

我認爲這是不可能的。這會導致很多可能的錯誤,例如:當你添加引用大一部分列表的列表時,會發生什麼?大列表中的下一個元素將被替換,還是插入?

據我所知,silce是獲取列表元素的內部機制。他們不創建新的列表對象,引用舊列表對象的部分。 Islice只是迭代slice給出的元素,它也不是引用,但是實際的對象 - 改變它並不影響原始列表。還是我誤會了?

如評論,該解決方案有助於真正巴斯蒂安先生,你可以這樣做:

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

這樣,你可以通過引用訪問列表中的每個指定的元素。

+0

我認爲你是對的。但對我來說,似乎像元組(列表,片)的東西可以滿足OP的需求。 –

+0

希望。其他選項可能會使用手工切片(對於xrange中的我(sliceobject.start,sliceobject.stop,sliceobject.step)mylist [i] = whatever) –

2

python中沒有什麼能夠真正做到你想要的。基本上你想寫一些代理對象。

3

您可以編寫一個列表視圖類型。下面是我自己編寫的實驗,它是由不保證完整或無缺陷的

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] 

您可以分配到指標在ListView,它會反思底層列表。但是,在listview上定義附加或類似的操作是沒有意義的。如果底層列表的長度發生變化,它也可能會中斷。