2013-11-20 19 views
1

基本的問題,但就是以下兩個事物之間的區別:列表使用:對::

list[0::,5] 
list[0:,5] 

此外,其中一個(如果任一)引用了1元多主場迎戰?

+0

在所有 – JBernardo

+2

沒有區別也不語法由默認的Python認可'list'類型;你在說NumPy'數組嗎?我爲你添加了'numpy'標籤,隨時可以再次刪除它(但是擴展你的問題以增加細節,但不清楚你所要求的)。 –

+0

對於第二個問題,你可以試試。 – DaoWen

回答

1

它們是等價的,但我打算將它們稱爲arr,因爲大概是對於一個numpy數組。

arr[0::,5] 
arr[0:,5] 

他們也相當於

arr[:, 5] 

在片中的:符號給出

arr[start:end:step] 

對於行。在逗號後面,列(對於更多維度也是如此)是一樣的。

如果離開符中的任意出來,他們被認爲是:

arr[0:len(arr):1] 

所以,如果你都不填,並保持分離,你必須:

arr[::] 

中當然,你可以插入任何默認值,它仍然是相同的:

arr[0::] 
arr[:len(arr):] 
arr[::1] 

你只需要把separa扭轉以消除歧義。暗示該step大小,你必須有兩個分離器:

arr[::1] 

但暗示的end,你只需要一個:

arr[:end] 

但是,如果你沒有分離,這只是獲得一個項目,而不是一個切片,所以第一個分離器是必要的:

arr[0] # only the first item! 
arr[0:] # all items 
+1

好,完整的答案。儘管如此,也許你想指出等價和默認值確實適用於numpy數組,但不一定適用於實現'__getitem__'的其他對象。 ([0 ::,5]確實與[0:,5]相同,但[:,5]不是)。 – Hyperboreus

+0

是的,正如你在答案中提到的那樣:)假設OP對切片對象的熟悉度,我會在評論中留下足夠的警告。 – askewchan

1

這兩個示例都通過(slice(0, None, None), 5)__getitem__函數list(您的變量名爲list)。沒有區別。你的問題可以簡化爲:

a[0::]一樣a[0:],得到的答覆仍然是「是的」。

另一方面,a[:0]a[::0]不相同,a[0:0]也不相同,與a[0::0]相同。

#! /usr/bin/python3 

class A: 
    def __getitem__ (self, item): 
     print (item) 


a = A() 
a [0::,5] #passes a tuple 
a [0:,5] #passes a tuple 

a [0:] #passes a slice 
a [0::] 
a [:0] 
a [::0] 
a [0:0] 
a [0::0] 

print ('Askewchan\'s conjecture:') 
a [:] 
a [0:] 

現在的__getitem__返回值調用一個元組,取決於其所調用的對象的實現。

+0

也有效地等同於'a [:]',因爲'0'與其他的一樣。 – askewchan

+0

@askewchan這取決於對象的實現。不必'slice(0,None,None)'必須產生與'slice(None,None,None)'相同的值。儘管如此,對於像列表這樣的內置迭代器來說也是如此。 – Hyperboreus