小数据池,编码问题

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)

  

猜你喜欢

转载自www.cnblogs.com/xiaoqianbook/p/10061105.html