python -- is和==的区别/encode编码/decode解码
1. is 和 == 区别
id()函数 找内存地址
s = "alex 是 大 xx" abc = id(s) # 得到内存地址 print(abc) #1012479728008
#列表 内存地址不一样 lst = ["周杰伦", "燃哥"] lst1 = ["周杰伦", "燃哥"] print(id(lst)) #963277169480 print(id(lst1)) # 963277169608
#元组 内存地址不一样 tu = ("燃哥", "周杰伦") tu1 = ("燃哥", "周杰伦") print(id(tu), id(tu1)) #836391259016 836391259080 #字典 内存地址不一样 dic = {"a": "b", "c":"d"} dic1 = {"a": "b", "c":"d"} print(id(dic), id(dic1)) #97329761808 97329761880
#字符串 内存地址一样,在小数据池中,会对字符串进行缓存, 为了节省内存 s = "燃哥" s1 = "燃哥" print(id(s)) #1012093704832 print(id(s1) #1012093704832
#int 内存地址一样 a = 10 b = 10 print(id(a), id(b)) #1419144496 1419144496 # 布尔 内存地址一样 a = True b = True print(id(a), id(b)) #1418653920 1418653920
== 判断两边的值
is 判断内存地址
# == is id # == 判断. 左右两端是否相等和一致, 比较的是内容 # is 判断. 判断的是内存地址 id()的值来判断 内存地址 #举例1: lst = ["马化腾", "小威"] lst2 = ["马化腾", "小威"] print(lst == lst2) # True print(lst is lst2) # False 列表内存地址不一样 #举例2: s = "alex" s2 = "alex" print(s == s2) # True print(s is s2) # True. 字符串有小数据池,内存地址一样
回顾编码:
1. ASCII: 英文, 特殊字符, 数字, 8bit, 1byte
2. GBK: 中文 16bit, 2byte. 兼容ASCII
3. unicode: 万国码, 32bit 4byte. 兼容ASCII
4. UTF-8: 长度可变的unicode. 英文:8bit, 欧洲:16bit, 中文:24bit 3byte
python2 只能用ASCII
python3 有unicode, 默认的编码就是unicode
内存里用的是unicode. 硬盘和网络传输用的是utf-8或者GBK
2. encode() 编码. 获取到的是编码之后的结果. bytes类型
# 想要存储.必须进行编码 # encode() 编码之后的内容是bytes类型的数据 # 英文:编码之后的结果是英文本身 # 中文:编码之后UTF-8 下. 一个中文3个字节 s="aj马" #UTF-8下,英文1个字节,保持不变;中文为3个字节 bs = s.encode("UTF-8") # 把字符串编码成UTF-8的形式 print(bs) #b'aj\xe9\xa9\xac'
s = "中" print(s.encode("utf-8")) #b'\xe4\xb8\xad' UTF-8中中文占3个字节 print(s.encode("GBK")) # b'\xd6\xd0' GBK中中文占2个字节
3. decode() 解码. 把bytes编程我们熟悉的字符串
# decode()解码 bs = b'\xb6\xf6\xc1\xcb\xc3\xb4' # 从别人那里读到的 GBK形式的代码 # 编程人认识的东西 默认转换成unicode,因为python运行的时候编码是unicode形式 s = bs.decode("GBK") # 解码之后是字符串, 用什么编码就用什么解码 print(s) #饿了么
4举例,将GBK编码转换成UTF-8
# GBK => UTF-8 bs = b'\xb6\xf6\xc1\xcb\xc3\xb4' # 先解码成unicode字符串 s = bs.decode("GBK") # 在把字符串编码成UTF-8 bss = s.encode("UTF-8") print(bss) #b'\xe9\xa5\xbf\xe4\xba\x86\xe4\xb9\x88' bytes类型