一、字符串编码
1、简介
计算机其实是只认识0和1的,我们编写的代码,要让计算机认识,中间涉及到字符转换为数字0和1的过程,这个过程实际上就是一个字符如何对应一个特定的数字标准,这个标准就称之为字符编码。
0/1 = 1bit
1byte = 8 bit # 计算机的最小存储单位 0-255的数值。
1、为了处理英文字符,产生了ascii码
2、为了处理中文字符,产生了GBK
3、为了处理各国字符,产生了Unicode
4、为了提高存储和传输性能,产生了utf-8
2、python3下字符编码使用情况
1、Unicode:简单粗暴,所有字符都是2bytes,优点:字符–>数字的转换速度快;缺点:占用空间大
2、utf-8:精准,对不同的字符用不同的长度表示,优点:节省空间;
缺点:字符–>数字的转换速度慢
3、python3中字符编码实际类型使用
1、内存中使用的是Unicode,用空间换时间
2、硬盘中或者网络传输用utf-8,尽可能节省带宽,保证数据传输的稳定性
4、编码(encode)和解码(decode)
1、编码(encode):将Unicode转换为其他指定的编码
2、解码(decode):将原编码转换为Unicode编码
s = '中' # 当程序执行时,字符会以Unicode形式保存到内存空间中
# 1.编码
s1 = s.encode('utf-8')
s2 = s.encode('gbk')
print(s)
print(s1)
print(s2)
print(type(s)) # <class 'str'>
print(type(s1)) # <class 'bytes'>
print(type(s2)) # <class 'bytes'>
# 2.巩固
a = '你好中国'
# 2.1Unicode-->gbk
unicode_gbk = a.encode('gbk')
print(unicode_gbk)
# 2.2Unicode-->utf-8
unicode_utf8 = a.encode('utf-8')
print(unicode_utf8)
# 2.3gbk-->utf-8
gbk_utf8 = unicode_gbk.decode('gbk').encode('utf-8')
print(gbk_utf8)
# 3.总结
"""
1、各个编码的相互转换都要先转换为Unicode,通过Unicode再转其他编码
2、gbk不只这一个
"""
print('中国'.encode(encoding = 'utf-8')) # 输出结果:b'\xe4\xb8\xad\xe5\x9b\xbd'
print('中国'.encode(encoding = 'gbk')) # 输出结果:b'\xd6\xd0\xb9\xfa'
5、python对于字符集的处理
6、字符串编码的作用
- python统一了编码,这样python在内部处理的时候不会因编码的不同而出现不能正常执行的问题。
- python会自动根据系统环境选择编码,但是经常在文件传输的过程中,会遇到各种不同的编码,这个时候就需要我们去处理编码问题。
二、深浅复制
1、深浅复制
# 深浅复制
# 定义如下列表
l1 = [1, 2, 3]
l2 = ['a', l1]
# 1.浅复制
import copy
l3 = l2.copy()
print(l3)
l2.append(6)
print(l2)
print(l3)
# 2.深复制
import copy
l4 = copy.deepcopy(l2)
print(l4)
l2.append('w')
print(l2)
print(l4)
注意:
1、字符串(数字):在内存中是一次性创建的,不能直接修改,如需修改,需要重新创建。
2、列表等可修改的数据类型:在内存总创建时是以链表的形式创建的
3、字符串、数字:赋值、深浅拷贝都没有意义,因为其永远指向同一个内存地址
4、列表、元组、字典:
2、赋值
3、浅拷贝
4、深拷贝
# 赋值:只是创建一个变量,该变量指向原来的内存地址
n1 = {'k1': 'fei', 'k2': 123, 'k3': ['fly', 18]}
# 赋值
n2 = n1 n1['k1'] = '米多奇'
print(n1) print(n2)
n1['k3'][0] = '淘气包'
print(n1)
print(n2)
# 1.浅复制:在内存中只额外的创建第一层数据
n1 = {'k1': 'fei', 'k2': 123, 'k3': ['fly', 18]}
import copy
n3 = copy.copy(n1)
n1['k1'] = '米多奇'
print(n1)
print(n3)
n1['k3'][0] = '淘气包'
print(n1)
print(n3)
# 2.深拷贝:
import copy
n1 = {'k1': 'fei', 'k2': 123, 'k3': ['fly', 18]}
n4 = copy.deepcopy(n1)
n1['k1'] = '米多奇'
print(n1) print(n4)
n1['k3'][0] = '淘气包'
print(n1)
print(n4)
三、bytes和bytearry
1、bytes二进制序列类型
- 指定长度的零填充字节对象
print(bytes(3)) # 结果为:b'\x00\x00\x00'
- 二进制字符对象
bytes(b'abc')
2、bytearray二进制数组
- 指定长度的零填充字节对象
bytearray(3)
- 二进制字符串对象
bytearray(b'abc')
注:二进制序列类型的用法比较少见,是python中少用的一种序列类型,对于二进制序列类型,基本了解即可。
print(type('fff'))
print(type(b'fff'))
# bytes是byte的序列,字符串是字符的序列
# 1.str-->bytes
s1 = '中'
b1 = s1.encode('utf-8')
print(b1)
# 2.bytes-->str
s2 = b1.decode('utf-8')
print(s2)
# 3.拓展
# 3.1str-->bytes
s = '淘气包'
b1 = bytes(s,encoding = 'utf-8')
b2 = bytes(s,encoding = 'gbk')
print(b1)
# 3.2bytes-->str.
s1 = str(b1,encoding = 'utf-8')
s2 = str(b2,encoding = 'gbk')
print(s1)
print(s2)
# 3.3bytearray
s1 = '你好,朦胧'
b1 = bytearray(s1,encoding = 'utf-8')
print(b1)
print(type(b1)) # <class 'bytearray'>
print(b1.decode('utf-8'))
b1[:6] = bytearray('美丽', encoding = 'utf-8')
print(b1)
print(b1.decode('utf-8'))
# 4.编码
s = '中' # 当程序执行时,字符会以Unicode形式保存到内存空间中
s1 = s.encode('utf-8')
s2 = s.encode('gbk')
print(s)
print(s1)
print(s2)
print(type(s)) # <class 'str'>
print(type(s1)) # <class 'bytes'>
print(type(s2)) # <class 'bytes'>
# 5.巩固
a = '你好潭州'
# 5.1Unicode-->gbk
unicode_gbk = a.encode('gbk')
print(unicode_gbk)
# 5.2Unicode-->utf-8
unicode_utf8 = a.encode('utf-8')
print(unicode_utf8)
# 5.3gbk-->utf-8
gbk_utf8 = unicode_gbk.decode('gbk').encode('utf-8')
print(gbk_utf8)
# 6.总结
"""
1、各个编码的相互转换都要先转换为Unicode,通过Unicode再转其他编码
2、gbk不只这一个
"""