前言

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

  • list
  • tuple
  • array.array
  • str
  • bytes
  • bytearray

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

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

0x00 可变的动态列表list

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

使用非常简单

>>> 

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中元素的数据类型可以参考下表

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])
<class 'str'>
>>> type(s)
<class 'str'>

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'x00x02x04x08'
>>> 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'x01x03x05x07t')
>>> ba[1]
3
# 删除一个元素
>>> del ba[1]
>>> ba
bytearray(b'x01x05x07t')
>>> ba[0]=2
>>> ba[0]
2
# 添加一个元素
>>> ba.append(6)
# 只能添加字节
>>> ba.append(s)
TypeError: 'str' object cannot be interpreted as an integer
>>> ba
bytearray(b'x02x05x07tx06')
# 字节的范围是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)
<class 'bytes'>
>>> str(b,encoding='utf-8')
'124'
# 或使用bytes的decode()
>>> b.decode()
'124'

0x07 总结

这些数据类型都是Python自带的,在实际开发中应该根据具体需求选择合适的数据类型。例如当要存储的元素类型是多种多样的,那么就应该使用list或者tuple。而array.array相对来说拥有较好的空间性能,但它只能存储单一类型。
我相信在很多业务场景中list或tuple是可以满足需求的,只是其它数据结构也要有所了解,在我们做一些基础组件时,会考虑数据结构的性能,或者阅读他人的代码时,能做到心中有数。

bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型相关推荐

  1. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  2. c 多线程运行混乱_一篇文章读懂 Python 多线程

    本文作者为 Michael Driscoll,是其新书 Python 201 的一节.本文译者为 linkcheng,由EarlGrey@编程派校对. 译者简介:linkcheng,专业电子信息工程. ...

  3. python 闭包_一篇文章读懂Python的闭包与装饰器!

    什么是装饰器? 装饰器(Decorator)相对简单,咱们先介绍它:"装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数", ...

  4. bytes数组转string指定编码_好程序员Java学习路线分享Java基础之string

    好程序员Java学习路线分享Java基础之string 好程序员Java培训 先来讲一下字符串 字串符分类: 不可变字符串:----String.字符串本身不能发生改变,与指向字符串的引用无关. St ...

  5. response对象的方法有哪些_一篇文章弄懂Request和Response(建议收藏复习)

    一:HttpServletRequest 1.简介: HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息. 它在每次请求s ...

  6. mysql中12e10等于多少_一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别...

    看完这篇文章,你能搞清楚以下问题: 1.varchar(100)和varchar(10)的区别在哪里? 2.varchar能存多少汉字.数字? 3.varchar的最大长度是多少呢? 4.字符.字节. ...

  7. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  8. c++ 读写锁_一篇文章弄懂MySQL锁机制

    一.锁的分类 1.按锁的粒度划分,可分为表级锁.行级锁.页级锁(mysql) 2.按锁级别划分,可分为共享锁.排他锁 3.按使用方式划分,可分为乐观锁.悲观锁 (一).按粒度划分的锁 1.表级锁(偏向 ...

  9. lbp7660cdn设置网络打印_一篇文章弄懂局域网打印机共享

    打印机具有高打印质量.高速度.高稳定性等特点,可广泛应用于POS系统.餐饮行业等需要现场实时打印收据的场合.现在打印机都有网络接口,这样使得网络打印更加方便.那么怎么添加打印机共享?下面,小编给大家讲 ...

最新文章

  1. python编程需要什么软件-《》 学习python编程需要安装哪些软件?
  2. 【Python小程序】这竟是2月14号情人节表白神器、成功率100%?(进来康康)
  3. 派生类的拷贝构造【C++继承】
  4. MS SQL巡检系列mdash;mdash;检查重复索引
  5. python修炼第四天
  6. 20种PLC元件编号和Modbus编号地址对应表
  7. Ubuntu设置root登录
  8. Intellij Idea的使用之svn篇
  9. 软件测试需要哪些c语言基础知识,测试人员都需要了解哪些redis知识?
  10. ARC098E Range Minimum Queries
  11. centos 7查看CPU温度
  12. 数字藏品即是风口也是风险!
  13. TEK-DPO2024示波器使用手册
  14. [openstack swift]0 swift介绍
  15. proteus三输入与非门名字_Proteus所有元件名称
  16. 利用辐射光谱计算温度 matlab,时间调制型FTIR光谱仪辐射度定标方法的研究
  17. 自动驾驶仿真(六)—— SIL软件在环仿真测试
  18. 嵌入式块设备内核驱动
  19. AutoCAD Mac如何安装?看完这篇你就会了~
  20. 冻结训练和解冻训练的区别

热门文章

  1. UBIFS - UBI File-System
  2. php基础语法知识笔记(一)
  3. windows7 删除hiberfil.sys文件的方法
  4. 为右键新建菜单添加内容
  5. 虚拟局域网(VLAN)的管理
  6. linux服务器下降,linux - 远程升级Ubuntu:如何最大程度地降低丢失服务器的风险? - Ubuntu问答...
  7. Android快速开发框架XUtils
  8. hive参数配置使用
  9. 为什么使用NativeJdbcExtractor
  10. mac安装python3.7两个版本_MAC下同时安装Python2和Python3