生物都是由细胞构成的,但在我们普通人眼中,并不会将鸡、鸭、狗、鸟这些动物当作细胞看待,因为对待事物的角度决定了我们更关心生物的外在形状和行为,而不是它的组织构成。

从计算机底层实现来说,所有的数据都是二进制字节序列。但为了更好地表达某个逻辑,计算机科学家们将数据抽象成不同的类型,犹如细胞和动物的关系。在编程语言中,对于字节序列,我们更关心的是它的存储和传输方式;而面向对象时,则着重于它的抽象属性。尽管两面一体,但从不混为一谈。

同为不可变序列类型,bytes 与 str 有着非常相似的操作方式。其同样支持加法、乘法等运算符。

>>> a = b"abc"

>>> b = a + b"def"

>>> b

b'abcdef'

>>> b.startswith(b"a")

True

>>> b.upper()

b'ABCDEF'

>>> b"abc" * 2

b'abcabc'

相比于 bytes 类型的一次性分配内存,bytearry 可按需扩张,更适合作为可读写缓冲区使用。如有必要,还可为其提前分配足够的内存,避免中途扩张造成的额外消耗。

>>> b = bytearray(b"abc")

>>> len(b)

3

>>> id(b)

4473445824

>>> b.append(ord("d"))

>>> b.extend(b"e")

>>> id(b)

4473445824

内存视图

当我们要引用字节数据的某个片段的时候,需要考虑到:是否会有数据复制行为?是否能同步修改?

>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])

>>> x = a[2:5] # 引用片段

>>> x

bytearray(b'\x12\x13\x14')

>>> a[3] = 0xEE # 修改原数据

>>> a

bytearray(b'\x10\x11\x12\xee\x14\x15\x16')

>>> x # 并未同步修改,可以看出仅仅只是数据复制

bytearray(b'\x12\x13\x14')

为什么需要引用某个片段,而不是整个对象呢?

以自定义网络协议为例,通常由标准头和数据体两部分组成。如要验证数据是否被修改,总不能将整个包作为参数交给验证函数吧。因为如果将整个包传给函数,这势必要求该函数了解协议包的结构,这显然是不合理的设计,而复制数据体又可能导致重大性能开销,同样得不偿失。

在 Python 中没有指针的概念,外加内存安全模型的限制,要做到这一点并不容易。此时,可以借助一种名为内存视图(Memory View)的方式来访问底层内存数据。

内存视图要求目标对象支持缓冲协议(Buffer Protocol),内存视图直接引用目标内存,没有额外的复制行为,因此,可读取最新的数据,在目标对象允许的情况下,还可以执行写操作。

>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])

>>> v = memoryview(a) # 完整的视图

>>> x = v[2:5] # 视图片段

>>> x.hex()

'121314'

>>> a[3] = 0xee # 对原数据进行修改,可通过视图观察到

>>> a

bytearray(b'\x10\x11\x12\xee\x14\x15\x16')

>>> x.hex()

'12ee14'

>>> x[1] = 0x13 # 因为引用了相同的内存区域,可通过视图修改原数据

>>> a

bytearray(b'\x10\x11\x12\x13\x14\x15\x16')

当然,能够通过视图修改原数据,还必须得看原对象是否允许。

>>> a = b"\x10\x11" # bytes 是不可变类型

>>> v = memoryview(a)

>>> v[1] = 0xEE

Traceback (most recent call last):

File "", line 1, in

TypeError: cannot modify read-only memory

如果要复制视图数据,可调用 tobytes、tolist 方法,复制后的数据与原对象无关,同样不会影响视图本身。

>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])

>>> v = memoryview(a)

>>> x = v[2:5]

>>> b = x.tobytes() # 复制并返回视图数据

>>> b

b'\x12\x13\x14'

>>> a[3] = 0xEE # 对原数据进行修改

>>> a

bytearray(b'\x10\x11\x12\xee\x14\x15\x16')

>>> b # 不影响复制数据

b'\x12\x13\x14'

除了上述这些,内存视图还为我们提供了一种内存管理手段,比如:通过 bytearray 预申请很大的一块内存,随后以视图方式将不同片段交给不同的逻辑使用。因为逻辑不能跨界访问,故此可以实现简易的内存分配器模式。对于 Python 这种限制较多的语言,合理使用视图可在不同使用 ctypes 等复制扩展的前提下,改善算法类型。

可使用 memoryview.cast、struct.unpack 将字节数组转换为目标类型。

从博客搬运到简书:原文链接

python3 byte_「Python3学习笔记」读书笔记—字节数组相关推荐

  1. 《Python学习手册》读书笔记

    原文地址为: <Python学习手册>读书笔记 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<P ...

  2. 「程序员的思维修炼——开发认知潜能的九堂课」读书笔记

    书名:程序员的思维修炼--开发认知潜能的九堂课 作者:(美) 亨特 (Andy Hunt) 译者:崔康 关于本书 本书从德雷福斯模型入手,阐释了程序工程师发展的五个阶段:接着从阶段间的特征中引出 L ...

  3. python有道云笔记_你很需要的,一个一键导出「有道云笔记」所有笔记的功能

    一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记. ...

  4. 《鸟哥的Linux私房菜-基础学习篇》读书笔记

    写在前面 嗯,来这边实训,青软的孔老师给装了一个有Linux系统的虚拟机,讲了一些Linux的常识,决定去看这本书,了解一些Linux的知识  . 加油生活^_^,嗯,希望以后的生活不会枯燥哎!!摘条 ...

  5. python有道云笔记_一键导出「有道云笔记」所有笔记

    一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得的 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记 ...

  6. python 有道云笔记-一键导出「有道云笔记」所有笔记

    一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得的 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记 ...

  7. python 有道云笔记-你很需要的,一个一键导出「有道云笔记」所有笔记的功能...

    一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记. ...

  8. tensorflow gpu利用率低_「动手学习Tensorflow」- Tensorflow综述I

    " 一文概览Tensorflow方方面面." 大家好,我是人工智能工程师Alpha浪. 今天,我们开始「动手学习Tensorflow - Tensorflow 综述」部分. 快速学 ...

  9. 你想学习吗?你会学习吗?你知道该如何学习吗?学习之道-读书笔记

    作者: [美] 芭芭拉·奥克利(Barbara Oakley):出版社: 机械工业出版社 :出版年: 2016-11 前言 我们的大脑潜力无穷,却没有配备使用手册 思考:大脑没有使用说明手册,想要很好 ...

最新文章

  1. 修改git的远程仓库命令
  2. /* * 编程第二题(20分): 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第十次落地时,共经过多少米?第十次反弹多高? */
  3. 【Paper】2009_Controllability of Multi-Agent Systems from a Graph-Theoretic Perspective
  4. 使用增量备份修复DG中的GAP
  5. [C++11]常量表达式函数
  6. pythonapp自动化_GitHub - qdyxmas/PyAutoTest: python Autotest UI自动化 APP自动化 HTTP接口自动化...
  7. 《三体》动画版官宣!B站出品 刘慈欣“倒吸一口凉气”
  8. 如何计算虚拟化vcpu_首次公开:腾讯云虚拟化技术原理及可用性提升实践
  9. linux备份mysql怎样操作,Linux下自动备份MySQL数据库详细操作步骤(转载)
  10. solr6.6初探之主从同步
  11. 如何用OBS录制Mac系统声音
  12. OPENCV 实现png绘制,alpha通道叠加。
  13. C# Emoji在Web端显示
  14. 各行业的英语术语(绝对精华 1)
  15. java中使用poi导出ppt(图片和表格)
  16. 纯js实现减速滚动置顶效果
  17. 抖音是怎么动摇美国国本的?
  18. CSRF攻击原理及防护
  19. 房贷利息怎么算, 千万别被砖家叫兽误导
  20. 网站分析-网站分析工具-免费网站分析软件

热门文章

  1. R语言dplyr包使用anti_join()函数返回在一个dataframe中存在而在另一个dataframe中没有匹配值的所有行实战
  2. linux文件查找命令find、which、locate、whereis 和type
  3. html块元素设置min-width,css min-width属性怎么用
  4. MySQL数据库have_openss_MySQL 关于OpenSSL证书支持检查方式
  5. ISLR_StatisticalLearning
  6. R Learnilng 十八讲1-6
  7. mysql为什么直接8.0_为什么要迁移到MySQL8.0?
  8. linux系统中安装java
  9. 多表查询事务DCL权限管理
  10. Chart.js-线形图分析(参数分析+例图)