python之路(内存,小数据池,编码等)
代码块:
python真正的代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
但是,在python终端交互模式下,每一条代码都是一个代码块
python在同一个代码块中的变量,初始化对象的命令时,它会将变量与值的对应关系放到一个字典中,
如果下面的代码在遇到初始化对象的命令,他会先从字典中寻找,如果存在相同的值,他会复用,指向的都是同一个内存地址。
>>> i1 = 1000 可以理解为这一行在一个文件中。
>>> i2 = 1000 可以理解为这一行在另一个文件中。
内存地址:用于保存数据到内存条的物理地址,查询一般用ID,检查一般用is或‘==‘
==:
name = ‘alex‘ # 赋值
print(‘alex‘ == ‘alex‘) # 数值相同
result:true
id:数据物理内存地址,在内存中地址是唯一的,如果两个变量指向的ID相同,则证明他们在内存中是同一个
name = ‘alex123‘
name1 = ‘alex123‘
print(id(name),id(name1)) # 2370269674608 2370269674608
is:判断两个变量的物理内存地址是否相同,如果is是True, == 一定是True
name = ‘alex123‘
name1 = ‘alex123‘
print(name is name1) #True
print(name == name1)#True
小数据池:python对内存做的一个优化,他将 -5 ~256 的整数,以及一定规则的字符串,提前在内存中创建了池,容器,可以节约内存,提高效率
符合规则的字符串:字母,数字,下划线组成,长度不超过20的字符串,含有特殊字符的字符串会单独创建一个内存地址.
python对于不同的代码块:初始化对象的命令时,他会从小数据池中寻找。
编码:数据的保存解读方式,分为ASCII,Unicode,utf-8,gbk,编码之间不能互相识别.网络传输或硬盘保存的0101数据,必须以非Unicode方式传输保存
ASCII:字母,数字.特殊字符
都是8个字节
Unicode:万国码,包含世界上所有的文字
都是32个字节,浪费资源
utf-8:英文,非英文,中文
英文:8个字节
非英文:16个字节
中文:24个字节
gbk国标:字母,数字,特殊字符,中文。
字母:8位
中文:16位
其中:
python的str编码都为Unicode,如果需要传输和保存,需要转为bytes数据类型
区别:
英文字母:
str:
表现形式:s1 = ‘abby‘
内部编码方式:unicode
bytes:
表现形式:b1 = b‘abby‘
内部编码方式:非unicode
中文:
str:
表现形式:s1 = ‘西西‘
内部编码方式:unicode
bytes:
表现形式:b1 = b‘\xe5\xa4\xaa\xe7\x99\xbd‘
内部编码方式:非unicode
str --- > bytes encode 编码
s1 = ‘abby‘
s2 = ‘西西‘
b1 = s1.encode(‘utf-8‘)
print(b1)
result:b‘abby‘
b2 = s2.encode(‘utf-8‘)
print(b2)
result:b‘\xe8\xa5\xbf\xe8\xa5\xbf‘ # utf-8 的bytes
bytes ---> str decode 解码
s2 = b2.decode(‘utf-8‘)
print(s2)
result:西西