python全栈学习记录(九)数据类型总结、深拷贝与浅拷贝、字符编码

数据类型总结、深拷贝与浅拷贝、字符编码

一、数据类型总结

不可变类型:当数据内部值变化时,数据的内存地址也必定会发生变化。
可变类型:当数据内部值变化时,数据的内存地址不会发生变化。

在这里插入图片描述
在这里插入图片描述

如上图所示有列表x=[10,100],y=10。如果改变列表的值x[1]=10本质只是改变了列表中第1个位置存储的内存地址,而并没有改变列表的内存地址(也就是x中的地址),所以列表是可变类型。而如果改变y的值y=100,本质就是把y中关联的内存地址变成了#3,改变了内存地址,所以数字类型是不可变类型。

其他的数据类型也是同样的道理,可以得出以下的数据类型总结表:

数据类型可变与不可变有序与无序元素是否可重复
数字类型不可变
字符串不可变
列表不可变有序可重复
元组不可变有序可重复
字典不可变无序键不可重复
集合不可变无序不可重复

二、深拷贝与浅拷贝

浅拷贝:拷贝一个新对象,把原先对象的内存地址放入新对象中。
深拷贝:拷贝一个新对象,把原先对象中所以内容都拷贝一份放入新对象中。

import copy
a=[1,2,[3,4]]
b=copy.copy(a) #浅拷贝
c=copy.deepcopy(a) #深拷贝
a[2][0]=0
a,b,c
<<<[1, 2, [0, 4]] [1, 2, [0, 4]] [1, 2, [3, 4]]

解释:
b浅拷贝 列表a,本质是开辟了一个新的内存地址存放列表b,然后取出a列表中的三个内存地址放入到b中。也就是说a[2]和b[2]引用的依然是同一个列表,所以当a中存放的列表值改变时,b中存放的列表值也会跟着改变。
c深拷贝a列表,本质是开辟了一个新的内存空间存放c列表,并在c列表中开辟三个新内存空间存放a列表中的值。简单来说就是c是与a完全不相干的一个新列表,c内部的值也没有引用a内部的值,所无论a如何的改变,c也不会跟着变。

易混点:
a=[1,2,[3,4]],b=a直接给变量赋值表示把b与a关联的列表相关联,a与b内关联的是同一个列表(id相同)。
a=[1,2,[3,4]],b=a.copy() copy函数表示浅拷贝,这个函数只有可变类型才有。

三、字符编码

1.字符编码发展史

总所周知计算机是以二进制的方式存储数据的,为了把数字,字母,文字等字符存入计算机中,就必须找到一中数字,字母,文字与二进制的对应关系,这也就是字符编码。
ASCII(American Standard Code for Information Interchange)是最早的字符编码标准,于1963年发布。它使用7位二进制数(共128个编码)来表示常见的英文字母、数字和一些特殊字符。ASCII编码是现代字符编码的基础,所有新的编码全都兼容ASCII编码。
随着计算机传入中国,中国人要用计算机存储汉语字符。GB2312是1981年发布的汉字编码国家标准,采用双字节编码,收录了6763个汉字和682个其它符号。但是计算机在各行业内快速普及,汉字不够用的窘迫也日益突出,最终在1995年12月1日制定了GBK编码,全称《汉字内码扩展规范》。它在GB2312的基础上收录了21003个汉字。GB18030是GBK的后续标准,收录了更多的汉字和少数民族文字。
除了中国的汉字需要相应的编码方式,世界其他国家的文字也需要相应的编码来存储到计算机中,所以急需一种统一的编码方案来表示所有字符。Unicode应运而生,它提供了全球统一的字符编码方案。Unicode采用多字节编码方式,可以使用不同的编码方案来表示字符。
为了减少存储空间的占用和传输带宽的消耗,出现了一种可变长度的Unicode编码方案,即UTF-8编码。UTF-8(Unicode Transformation Format - 8-bit)是一种可变长编码方式,它使用1到4个字节来表示字符,根据字符的不同而变化。UTF-8编码具有向后兼容性,能够表示所有Unicode字符,并且在存储空间和传输效率上相对较高,因此成为互联网上广泛使用的字符编码方案之一。
除了UTF-8,Unicode还有其他编码方案,如UTF-16和UTF-32。UTF-16使用2个或4个字节来表示字符,而UTF-32则始终使用4个字节表示字符。这些编码方案在某些特定情况下仍然被使用,但在互联网上广泛采用的是UTF-8编码。

2.python的字符编码

python解释器运行代码分成了三个步骤:

  • 启动解释器
  • 从硬盘读入文件至内存
  • 解释器读入内存中的内容并执行python语法

如果只看前两个阶段,可以把python解释器视为一个文编编译器。比如说windows中最常见的文编编译器txt记事本,它的工作原理就是从硬盘中读取文件到内存中并显示在屏幕上,用户修改的是内存中的文本,只有保存以后文本内容才会重新保存到硬盘中。使用txt记事本会遇到一种情况,读出来的是一堆看不懂的乱码,这是怎么回事呢?原来是文件保存到硬盘时会选择一直编码方式转为二进制的形式写入硬盘,读取时也会选择一中编码方式将硬盘中的二进制读入文编编译器中,可如果写入时的编码方式和读取时的编码方式不同就会出现乱码的情况。现在回到python解释器如果第二步读入是代码是乱码,而解释器尝试取运行乱码就会出现如下的报错情况:SyntaxError: Non-xxx code starting with ‘\xxx’ in file xxx.py on line 2, but no encoding declared。为了解决这种情况可以在文件的开头加上# encoding=xxx(xxx为具体的编码方式,如gbk、utf-8等等)来告知解释器文件的读取方式。

3.字符编码一些细节

  • ASCII码表:用1Bytes表示一个英文字符
  • GBK:用2Bytes表示一个中文字符,1Bytes去表示英文字符
  • unicode:内存中使用的是unicode编码,unicode把全世界的字符都建立好对应关系,用2Bytes去表示一个字符
  • utf-8 用1Bytes表示英文,用3Bytes表示中文
  • 内存中固定使用unicode编码,我们唯一可以改变的存储到硬盘时使用的编码
  • python3解释器默认编码是UTF-8,python2解释器默认编码是ASCII

4.python中的编码与解码

encode用于将字符串(unicode)编码为gbk、utf-8等形式
decode用于将字符串(gbk、utf-8等形式)解码为unicode

a='你好'
b=a.encode('utf-8')
b
<<<b'\xe4\xbd\xa0\xe5\xa5\xbd'

b.decode('utf-8')
<<<'你好'

ord可以把字符串转为ascii形式
chr可以把ascii转为字符形式

a='a'
b=ord(a)
b
<<<97

chr(b)
<<<'a'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值