关于我

编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。

联系:hylinux1024@gmail.com

数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种“数组”类型的实现。

list

tuple

array.array

str

bytes

bytearray

其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念,即把列表、序列、数组都当作array-like数据类型来理解。

注意本文所有代码都是在Python3.7中跑的^_^

0x00 可变的动态列表list

list应该是Python最常用到的数组类型了。它的特点是可变的、能动态扩容,可存储Python中的一切对象,使用时不用指定存储的元素的类型。

使用非常简单

>>> arr = ["one","two","three"]

>>> arr[0]

'one'

# 动态扩容

>>> arr.append(4)

>>> arr

['one', 'two', 'three', 4]

# 删除一个元素

>>> del arr[2]

>>> arr

['one', 'two', 4]

复制代码

0x01 不可变的tuple

tuple的操作与list类似。它的特点是不可变,不能扩容,可存储Python中的一切对象,使用时不用指定存储的元素的类型。

>>> t = 'one','two',3

>>> t

('one', 'two', 3)

>>> t.append(4)

AttributeError: 'tuple' object has no attribute 'append'

>>> del t[0]

TypeError: 'tuple' object doesn't support item deletion复制代码

tuple可以使用+运算符,这个运算将创建一个新的tuple对象用于存储数据。

>>> t+(1,)

('one', 'two', 3, 1)

>>> tcopy = t+(1,)

>>> tcopy

('one', 'two', 3, 1)

>>> id(tcopy)

4604415336

>>> id(t)

4605245696

复制代码

可以看出tuple执行+运算符之后两个对象的地址是不一样

0x02 array.array

如果在Python中要用到其它语言中类似“数组”的数据结构,就需要用到array模块了。它的特点是可变的、存储相同类型的数值,不能存储对象。

因为array在使用的时候要指定元素数据类型,因此它比list和tuple都有比较高效空间性能。

# 使用时指定元素数据类型为`float`

>>> arr = array.array('f', (1.0, 1.5, 2.0, 2.5))

>>> arr

array('f', [1.0, 1.5, 2.0, 2.5])

# 修改一个元素

>>> arr[1]=12.45

>>> arr

array('f', [1.0, 12.449999809265137, 2.0, 2.5])

# 删除一个元素

>>> del arr[2]

>>> arr

array('f', [1.0, 12.449999809265137, 2.5])

# 增加一个元素

>>> arr.append(4.89)

>>> arr

array('f', [1.0, 12.449999809265137, 2.5, 4.889999866485596])

# 如果将一个字符串类型数据存储到一个浮点数的数组将会报错

>>> arr[0]='hello'

TypeError: must be real number, not str

复制代码

array中元素的数据类型可以参考下表

Type code

C Type

Python Type

'b'

signed char

int

'B'

unsigned char

int

'u'

Py_UNICODE

Unicode character

'h'

signed short

int

'H'

unsigned short

int

'i'

signed int

int

'I'

unsigned int

int

'l'

signed long

int

'L'

unsigned long

int

'q'

signed long long

int

'Q'

unsigned long long

int

'f'

float

float

'd'

double

float

0x03 字符串序列str

Python3中使用str对象来表示一个文本字符序列(看,这跟Java中的字符串String是多么相似呢)。它的特点不可变的Unicode字符序列。

在str中它的每一个元素都是字符串对象。

>>> s ='123abc'

>>> s

'123abc'

>>> s[0]

'1'

>>> s[2]

'3'

# 字符串是不可变的序列,不能删除其中的元素

>>> del s[1]

TypeError: 'str' object doesn't support item deletion

# 要对字符串进行操作,可以转化成list

>>> sn = list(s)

>>> sn

['1', '2', '3', 'a', 'b', 'c']

>>> sn.append(9)

>>> sn

['1', '2', '3', 'a', 'b', 'c', 9]

# 字符串中的元素也是字符串对象

>>> type(s[2])

>>> type(s)

复制代码

str对象也可以执行+操作,它也会生成一个新对象用于存储。

>>> s2 = s+'33'

>>> s2

'123abc33'

>>> id(s2)

4605193648

>>> id(s)

4552640416

复制代码

0x04 bytes

bytes对象用于存储字节序列,它的特点是不可变存储,可存储0-256的数值。

>>> b = bytes([0,2,4,8])

>>> b[2]

4

>>> b

b'\x00\x02\x04\x08'

>>> b[0]=33

TypeError: 'bytes' object does not support item assignment

>>> del b[0]

TypeError: 'bytes' object doesn't support item deletion复制代码

0x05 bytearray

bytearray对象与bytes类似,用于存储字节序列。它的特点是可变的,能动态扩容的字节数组。

>>> ba = bytearray((1,3,5,7,9))

>>> ba

bytearray(b'\x01\x03\x05\x07\t')

>>> ba[1]

3

# 删除一个元素

>>> del ba[1]

>>> ba

bytearray(b'\x01\x05\x07\t')

>>> ba[0]=2

>>> ba[0]

2

# 添加一个元素

>>> ba.append(6)

# 只能添加字节

>>> ba.append(s)

TypeError: 'str' object cannot be interpreted as an integer

>>> ba

bytearray(b'\x02\x05\x07\t\x06')

# 字节的范围是0-256

>>> ba[2]=288

ValueError: byte must be in range(0, 256)

复制代码

bytearray可以转化成bytes对象,但效率不是很高。

# bytearray转成bytes将生成一个新对象

>>> bn = bytes(ba)

>>> id(bn)

4604114344

>>> id(ba)

4552473544

复制代码

0x06 各个类型相互转化

tuple->list

>>> tuple(l)

('a', 'b', 'c')

复制代码

list->tuple

>>> t

('a', 'b', 'c')

>>> list(t)

['a', 'b', 'c']

复制代码

str->list

>>> l = list('abc')

>>> l

['a', 'b', 'c']

复制代码

list->str

>>> l

['a', 'b', 'c']

>>> ''.join(l)

'abc'

复制代码

str->bytes

>>> s = '123'

>>> bytes(s)

TypeError: string argument without an encoding

>>> bytes(s,encoding='utf-8')

b'123'

# 或者使用str的encode()方法

>>> s.encode()

b'123'

复制代码

bytes->str

>>> b = b'124'

>>> b

b'124'

>>> type(b)

>>> str(b,encoding='utf-8')

'124'

# 或使用bytes的decode()

>>> b.decode()

'124'

复制代码

0x07 总结

这些数据类型都是Python自带的,在实际开发中应该根据具体需求选择合适的数据类型。例如当要存储的元素类型是多种多样的,那么就应该使用list或者tuple。而array.array相对来说拥有较好的空间性能,但它只能存储单一类型。

我相信在很多业务场景中list或tuple是可以满足需求的,只是其它数据结构也要有所了解,在我们做一些基础组件时,会考虑数据结构的性能,或者阅读他人的代码时,能做到心中有数。

0x08 学习资料

python数组类型_一文搞懂Python中的所有数组数据类型相关推荐

  1. python输入时间_一文搞懂python日期时间处理

    前言 datetime是python的内置模块,用来处理日期和时间. 该模块常用的类有: 本文旨在讲解datetime模块中datetime类的使用方法. datetime对象是 date 与 tim ...

  2. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  3. python读取枚举_一文读懂Python 枚举

    enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性.我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护. 创建枚举 我 ...

  4. python中row是什么意思_一文搞懂Python中的yield

    关注公众号「Python七号」,及时 get Python 技能. yield 可以实现生成器,可以实现协程. 什么是生成器,什么是协程,如果还不了解,可以继续往下看,概念可以不懂,只要理解它的作用和 ...

  5. python 推迟运行_一文看懂Python的time模块sleep()方法和strftime()方法

    概述 今天主要介绍一下Python的time sleep()方法和strftime()方法. 一.Python time sleep()方法 Python time sleep() 函数推迟调用线程的 ...

  6. 服务器千兆网卡接百兆交换机不通_一文搞懂监控工程中百兆交换机和千兆交换机的区别在哪?...

    安防监控系统工程现在都是用的网络摄像机,那么就肯定会经常和网络设备--交换机打交道,很多人在做监控方案的时候犯难,多少台摄像机该选用百兆交换机还是千兆交换机呢?关于这个问题除了需要掌握理论知识还是结合 ...

  7. python中gbk字符原因报错_不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码...

    原标题:不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码 程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广, ...

  8. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  9. 一文搞懂Qt中的颜色渐变(QGradient Class)

    一文搞懂Qt中的颜色渐变(QGradient Class) 1, 快速开始! Qt中与颜色渐变有关的类是QGradient 其中它又有三个子类:QLinearGradient.QRadialGradi ...

最新文章

  1. Java基础-Date类常用方法介绍
  2. 科学家打造全套人工神经系统 帮助瘫痪病人重新控制身体
  3. 理解数据成员指针、函数成员指针
  4. 正则不以什么开头_python基础 | 正则扫盲
  5. hibernate jpa_JPA / Hibernate实体状态转换的初学者指南
  6. Elasticsearch5中安装Elasticsearch-head插件
  7. 【日本語勉強】日本語四級文法突撃(11~20)
  8. 设计模式 经典书籍必备推荐
  9. 区块链开发公司:区块链技术如何改变个人数据安全
  10. 二叉树的前序中序后序 递归与非递归解法
  11. 《MapReduce 2.0源码分析与编程实战》一1.5 看,大象也会跳舞
  12. TMS570LC43xx SylixOS can 驱动
  13. Lucene 如何热备份
  14. Unity上传图片到服务器及服务器如何配置
  15. c语言playsound参数,通达信playsound函数
  16. windows 图片和传真查看器不能旋转
  17. [心得]如何系统自学经济学
  18. 使用C2Prog烧写程序
  19. mysql中长整型是longint_整型int和长整型long
  20. ArcGIS10试用体验之安装篇

热门文章

  1. kill -9都杀不掉的进程
  2. 嵌入式linux的学习笔记-pipe管道(二)
  3. 再读《精通css》00
  4. shell下移动文件
  5. 《操作系统》——第一章 计算机系统概述
  6. 贪心算法——洛谷(P1094)纪念品分组
  7. php file get contents 空,file_get_contents()函数为空
  8. 值此中秋圆月夜 数据天涯共此时
  9. 再也不用担心无法将中断绑定到多队列网了
  10. 穿透、击穿、雪崩…Redis这么多问题,如何解决