列表使用:vs. ::

时间:2013-11-20 17:07:48

标签: python numpy

基本问题,但下面两件事之间的区别是什么:

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

另外,哪一个(如果有的话)引用1个元素与多个?

2 个答案:

答案 0 :(得分:1)

两个示例都将(slice(0, None, None), 5)传递给__getitem__的{​​{1}}函数(您的变量名为list)。没有区别。您的问题可以简化为:

lista[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:] 的返回值取决于调用它的对象的实现。

答案 1 :(得分: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]

您只需要使用分隔符来消除歧义。要暗示step大小,您必须同时拥有两个分隔符:

arr[::1]

但是暗示end,你只需要一个:

arr[:end]

但是,如果你没有分隔符,那只是获得一个项目,而不是一个切片,所以第一个分隔符是必要的:

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