python基础4(小数据池,编码,深浅拷贝)
Posted Walt Hwang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础4(小数据池,编码,深浅拷贝)相关的知识,希望对你有一定的参考价值。
1、==与is
- == 比较值是否相等
- is比较内存地址是否相同
2、小数据池
- 为了节省内存,当数据在一个范围里的时候,两个值相同的变量指向的是小数据池里的同一个地址
- 数字范围:-5 ~ 256
-
num1 = 3 num2 = 3 i1 = id(num1) i2 = id(num2) #此时i1==i2
3、编码
- ascii: 8位 1字节 表示一个字符
- unicode: 32位 4字节 表示一个字符
- utf-8
- 英文 8位 1字节
- 欧洲 16位 2字节
- 亚洲 24位 3字节
- gbk
- 英文 8位 1字节
- 中文 16位 2字节
- 各个编码之间的二进制,是不能互相识别的,会产生乱码
- 文件的传输,存储不能是unicode(只能是utf-8、utf-16、gbk、gb2312、ascii等)
- python3中str是使用unicode编码的
-
4、深浅拷贝
- 原因:共享内存导致的结果
- 如果通过赋值,使两个变量指向同一个内存地址(可变数据类型),则修改其中的一个,另一个也会跟着修改。如果是不可变数据类型(如字符串),修改一个另一个不会变
li1 = [1,2,3] li2 = li1 li2[0] = 2 print(li) # -> [2,2,3]
- 浅拷贝:数据半共享,复制的数据独立存放在其他内存中,但是只复制第一层。如果是列表等可变数据类型,拷贝的是内存地址,所以修改这类元素,还是会全都改变
li1 = [1,2,3,[4,5]] li2 = li1.copy() #修改第一层 li2[0] = 3 #此时:li2 = [3,2,3,[4,5]] #但li1未更改:li1 = [1,2,3,[4,5]] #修改其中的列表 li2[3][1] = 9 #此时:li2 = [3,2,3,[4,9]] #li1对应元素修改:li1 = [1,2,3,[4,9]]
从内存来看:
- 深拷贝:数据完全不共享,复制的数据完全独立放到另一个内存中,包括可变数据类型的内容
import copy #使用深拷贝需要导入copy li1 = [1,2,3,[4,5]] li2 = copy.deepcopy(li1) #深拷贝 #此时修改li2的所有元素,li1都不会改变 li2[3][0] = 777 #li1仍是[1,2,3,[4,5]]
以上是关于python基础4(小数据池,编码,深浅拷贝)的主要内容,如果未能解决你的问题,请参考以下文章