燃烧我的列表

数组这个东西很常见吧,学过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同学」

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181209G0CEJ600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券