数组这个东西很常见吧,学过C,Java的同学都知道,它是“存储同种类型元素的集合”,注意两点:
1.数组里元素必须是同一种类型
2.数组的元素在内存中是连续分配的
Python里的列表这个数据类型跟数组內似,但也有些不同,从表面看来,列表可以存储不同的数据类型
1ls = [1,'yk',66.66]
我们可以看看列表的内部结构:
列表的内部结构有两部分组成,保存元素数量和内存分配计数的头部(也就是说包括元素存储区的容量和当前表中已有的元素个数两项),以及存储元素指针的独立数组,注意,元素不再存储着实际的内容(1,'yk',66.66),而是存储着指向它们的指针(地址),所以列表能存储不同类型的元素。
接下来我们看看几个常见的小细节
1.+ 与 +=
1a = [1,'yk',66.66]
2b = a
3a = a + [2,3]
4print(b)# [1, 'yk', 66.66]
5print(a)# [1, 'yk', 66.66, 2, 3]
第2行代码,b与a同时引用了列表,而在第3行中 使用了 "+"操作符,此时,新建了列表对象,b 仍保存着之前的元素,而 a 又重新保存了新增的元素。
1a = [1,'yk',66.66]
2b = a
3a += [2,3]
4print(b)# [1, 'yk', 66.66, 2, 3]
5print(a)# [1, 'yk', 66.66, 2, 3]
现在看到 + 与 += 在列表中的不同了吧, "+=" 相当于原地修改,影响引用的元素,而"+"相当于新建了对象。
2.二维数组怎么创建?
在 Python中,创建二维数组要细心,比如这样创建后
1# 创建2行3列的二维数组
2a = [[None] *2] *3
3a[][1] =1
4print(a)# [[None, 1], [None, 1], [None, 1]]
啊呀?我们本来的目标是 仅修改 a[0][1] 的元素为1,可为什么 每列都受到了影响。
原来罪魁祸首是 "引用",即每个"一维数组"里面又保存着(指向着)同一个 "数组"
不要忽略 "*" 号
1a = [None] *2
2print(a)# [None, None]
3# 每行 id 都相同
"*" 号本质上就是 把 None这个对象又复制了一份,注意这里的复制的是引用,再结合上面的例子思考下。
那么二维数组该怎么创建?
1.简单粗暴直接创建
1a = [
2[1,2,3],
3[4,5,6],
4[7,8,9]
5]
2.列表推导式
1a = [[Noneforiinrange(2)]forjinrange(3)]
3.应用numpy或pandas模块
1importnumpyasnp
2t1 = np.array([[1,2,4],[3,4,5]])
3print(t1)# [[1 2 4]
4# [3 4 5]]
5# 创建全为0的数组
6t2= np.zeros((2,3), dtype=np.int)
7print(t2.shape)# (2, 3)
8# 如果需要了解,请自行搜索资料
总结:
1.对于python的列表,除了基本操作外,要知道它的结构,如果知道它怎样动态扩容的那就更好了。
2.在列表中,"+=" 相当于原地修改,影响引用的元素,而"+"相当于连接,新建了对象。
3.要小心引用,因为不经意间就会掉坑。
4."*"号会复制内容。
5.二维数组的创建。
觉得本文对你有帮助?请分享给更多人
关注「阿T同学」
领取专属 10元无门槛券
私享最新 技术干货