1. 小数据池,
id
id() 查看变量的内存地址
通过id()我们可以查看到⼀一个变量量表⽰示的值在内存中的地址
小数据池针对的是: int, str, bool
在py文件中几乎所有的字符串都会缓存.
a = 10 b = 30 print(id(a))#1352229376 print(id(b))#1352230016 lst = ["胡辣汤"] print(id(lst))#3070023188872 lst = [] lst.append("胡辣汤") print(id(lst))#3070023188808 lst1 = [1,2,3]# 两个对象 内存地址是不一样的 lst2 = [1,2,3] print(id(lst1))#2114848899464 print(id(lst2))#2114848899272 s1 = "abc" #内存中没有"abc",创建一个新的0.0001 s2 = "abc" #内存以有力"abc" 直接拿"abc" 0.00000001 print(id(s1),id(s2))#2447874555384 2447874555384 # 把字符串的缓存-> 小数据池 -> String iterning -> 常量池 -> 字符串缓存 #什么数据会缓存 #数字,字符串,布尔值 ==>不可变的数据类型 #字符串.如一连串字符串,几乎都会被缓存 s1 = "alex昨天上厕所没关门. 韩红冲进去了. 面筋歌出来了" s2 = "alex昨天上厕所没关门. 韩红冲进去了. 面筋歌出来了" print(id(s1),id(s2))#2431087496432 2431087496432 # 如果在py文件中写的字符串. 几乎都是缓存的 # 在黑窗口里的写的几乎都不会缓存 # 不同的解释器. 缓存的机制也不一样 # 优点: 可以帮我们快速的创建对象.节省内存. # 缺点: 缓存如果过大. 响应速度会比较慢
is和==的区别
is 比较的是内存地址
== 比较的是内容
当两个变量指向同一个对象的时候. is是True, ==也是True
lst1 = [1,2,3] lst2 = [1,2,3] print(id(lst1),id(lst2))#1634021425544 1634021425480 print(lst1==lst2)#Ture print(lst1 is lst2)#False s1 = "我是小钱" s2 = "我是小钱" print(id(s1),id(s2))#1603830872352 1603830872352 print(s1==s2)#True print(s1 is s2)#True
编码的补充
在python3中. 默认的编码是unicode,我们的字符串就是unicode
在python2中. 默认的编码是ASCII. Cpython.c语言的默认编码是ASCII
unicode弊端:在存储和传输的时候. 是很浪费的
在存储和传输的时候不能直接使用unicode. 必须要对字符串进行编码. 编码成bytes类型
bytes: 字节形式的字符串
1. encode(编码格式) 编码
2. decode(编码格式) 解码
bs = b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0' # 把这个bytes转化成gbk的bytes s = bs.decode("utf-8") g = s.encode("gbk") print(g)