python里面有:

1)list 数组

slice 切片

2)tuple  元组

3)dict  字典

4)set  集合

golang的:

1) array 数组

slice 切片

2)没有元组

3)map 字典

4)没有基础类型的set

综上,两者都有的:数组,字典

1.数组

1) python:

a) python中数组是list,可以直接使用一对[ ]括起来的数据来初始化,或者初始化一个空的数组:

1 >>> a=[]2 >>> b=["aa","bb","cc"]

甚至数组中元素可以类型不一样O__O "…

1 >>> c=["aa","bb",123]2 >>>len(c)3 3

4 >>>type(c)5

6 >>>type(c[0])7

8 >>> type(c[1])9

10 >>> type(c[2])11

b) 访问元素,可以下标(溢出会报错,下标可以是负数):

1 >>>b[0]2 'aa'

3 >>> c[2]4 123

5 >>> c[3]6 Traceback (most recent call last):7 File "", line 1, in

8 IndexError: list index out of range

或者遍历:

1 for val inc:2 printval3 #或者4 for idx, val inenumerate(c):5 print idx,val

也可以使用c.index(obj),返回的是list里面的第一个值为obj的索引(下标)

c) 追加、修改元素。注意追加(append)的时候,参数是元素,如果是追加另一个list,那么要使用newlist=a+xxx或者a.extend(xxx),前者是两个list拼接,后者是把xxx追加到a,据说前者效率高些。appned()的参数如果是list,那么这个list会作为元素插入原来list的末尾:

1 >>> a=["11"]2 >>> a.append("abc")3 >>> a.append(123)4 >>> a[0]=111

5 >>> printa6 [111, 'abc', 123]

遍历里面的修改:

1 c=["aa","bb",123]2 for idx, val inenumerate(c):3 if idx == 1:4 val="1" #不能修改数组里面的值

5 if idx == 2:6 c[idx]="2" #修改数组里面的值

7 printc8 #输出:['aa', 'bb', '2']

d) 插入元素也可以用c.insert(idx,val)会在下标为idx(如果是负数,则是逆序的下标,从-1开始)的位置插入这个val,其他的依次后移。虽然不清楚python中list的底部实现,但是如果是数组,这样操作的效率应该不会很高,不是很推荐。

e) 删除元素 del c[idx]

python中的切片(slice):

切片是构建在数组上的概念。原来我总是理解不了,“切片”,从字面上看完全理解不了,接受不了。后来觉得可以理解为数组的的取值器,大概可以想象一个数组就是一个轨道,切片是滑动在轨道上的一个框,框出数组的一部分。

1 >>> a=[1,2,3,4,5,6]2 >>> b=a[2:5]3 >>> printb4 [3, 4, 5]

a[start:end] 就是取 [start,end)这个区间的元素,start,end是下标。就是说包含start,但是不包含end,即start~(end-1)。上面的例子就是取下标为2,3,4的元素。

如果start >= end,取出来的就是空数组。

start是可以负数,数组的最后一个值下标是-1.往前一个是-2,以此类推。

start或者end可以为空,为空就是不设限。

除了start和end,还有个步长的参数。这个感觉用的不多,不过步长设为-1,即[::-1],就是反转数组,这个挺有用。

简单来说,如果切片当做一个滑动框,那么这个框随意滑,能框到数据就返回数据,框不到数据,就返回空数组。左右边框可以给任意的下标值,正数就从数组的0下标开始计;负数就从数组的最大下标开始,计为-1。而且,左边框的下标要包含,有边框的下标不包含。

2) golang:

a) golang中的数组,初始化:

1 a := []string{"1","2"}2 var b []string

3 c := []string{}4 d := make([]string,2)

其中,make这种方式,创建的是一个包含元素的数组。比如d这里有两个元素,两个空的字符串。如果这个数组是[]int,则包含了两个0。即各自类型的零元素。

数组元素类型是要求一样的,这个和python不一样。

b) 访问元素,下标(溢出会报错,而且下标必须不能是负数),遍历:

1 a := []string{"1","2","3","4"}2 for idx, val :=range a {3 fmt.Println(idx, val)4 }

c) 追加、修改元素:

1 a = append(a, "abc")2 a[2] = "new2"

d) 插入元素,好像没有。。当然,可以通过slice切分,在数组中间append一个值,再把数组后半段append回去。总之,对数组的插入元素,不是好的做法。

e) 删除元素,好像也没有。。同样,在数组中间删除元素也不推荐。

golang中的切片(slice):

我觉得golang中的切片和python可以一样理解。

m := []string{"a","b","c","d","e"}

m1 := m[2:3]

// m1=["c"]

m[start:end],同样是[start,end)区间。不过golang里面不支持负数的下标,也不支持步长。必须start<=end.否则报错。感觉其他没啥区别。