8、字符编码和深浅拷贝
一、字符编码
我们知道,计算机的只能识别二级制,而人类在与计算机交互时,使用的是人类能懂的字符,如中文字符,英文字符。
那么,由人类的字符到计算机中的二级制,必须要经历一个翻译的过程,而翻译的过程必须参照一个特定的标准,该标准称之为字符编码表,该表上存放的就是字符与数字的对应关系。
1、字符编码发展的三个阶段
(1)阶段一
计算机起源于美国,美国人制定了ASCII表,只规定了英文字符以及一些特殊字符与数字的对应关系。
ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
(2)阶段二
后来计算机传入到其他国家,其他国家均制定了自己的字符表,用来识别自己国家的语言,例如 中国的GBK,日本的Shift_JIS,
(3)阶段三
各个国家不同的字符表标准,相互使用会出现混乱,日本的文档拿到中国来就成了乱码,那么就迫切需要一个世界标准,于是乎unicode应运而生
ASCII 用1个字节(8位二进制)代表一个字符
unicode 常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节
这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效
本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
"""
总结:
内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),
硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。
"""
2、字符串编码解码使用
# 编码encode
x='嘿嘿嘿' # 在python3中,'嘿嘿嘿'被存成unicode
res=x.encode('utf-8')
print(res,type(res))
# 运行结果
b'\xe5\x98\xbf\xe5\x98\xbf\xe5\x98\xbf' <class 'bytes
# 解码decode
res.decode('utf-8')
# 运行结果
嘿嘿嘿
二、深浅拷贝
需求:
1、copy一下原来的列表,产生一个新的列表。
2、两个列表需要完全独立开,即一方的操作不会对另一方产生任何影响。
1、浅copy
1、定义:生成一个新列表,把原列表的第一层的内存地址不加区分地完全copy给新列表。
2、效果:
①对其中一个列表中的不可变类型的赋值操作,都是产生了新值,让该列表的索引指向了新的内存地址,所以并不会影响另一个列表。
②对其中一个列表中的可变类型的操作,只是改变的该可变类型的中包含的值,但整体内存地址没有变,因为两个列表中包含的是同一份内存地址,所以另外一个列表中的可变类型会同步改变,其实可以理解为两个列表此时内部包含的该可变类型是共享的。
a = [1,2,[33,44]] # 原列表
b = a.copy() # 复制的新列表
a[0] = 5
a[1] = 6 # 将原列表中的不可表类型重新赋值
a[2][0] = 77
a[2][1] = 88 # 将原列表中的可变类型中的值更改
print (a) # 结果为[5, 6, [77, 88]]
print (b) # 结果为[1, 2, [77, 88]],即新列表中的不可变类型不会随原列表更改而变化,而可变类型会随之变化
3、结论:这种浅copy的方式只能满足产生与原列表一样的新列表,无法满足两个列表完全独立。
2、深copy
1、定义:生成一个新列表,检索原列表中的类型,把不可变类型的内存地址完全copy给新列表,在新列表中新建内存空间,重新生成内存地址,把可变类型的仅是值放入。
2、效果:对其中一个列表的操作不会对另一个列表产生任何影响。
import copy # 调用copy模块功能
a = [1,2,[33,44]] # 原列表
b = copy.deepcopy(a) # 复制的新列表
a[0] = 5
a[1] = 6 # 将原列表中的不可变类型重新赋值
a[2][0] = 77
a[2][1] = 88 # 将原列表中的可变类型中的值更改
print (a) # 结果为[5, 6, [77, 88]]
print (b) # 结果为[1, 2, [33, 44]],新列表中可变与不可变类型都没有随着原列表的更改而变化,可见已完全独立开
3、结论:要实现开头的需求,需要使用深copy。

浙公网安备 33010602011771号