小数据池,编码,is与==的区别
#小数据池 a = [1,2,2,13,123,123,12,3,12,3,12,312,3,12,32,13,12,3,21] b = a # 明天深浅拷贝 # 内存地址 id() print(id(a)) print(id(b)) a = 1000 print(id(a)) # 内存的开辟是由解释器来完成的. # 双胞胎 # == 比较的是值(内容) True # is 比较的是内存地址(是不是同一个对象) False lst1 = [1,2,3] lst2 = [1,2,3] print(lst1 == lst2) # 长得一样 print(lst1 is lst2) # 不是同一个对象 a = "alex" b = "alex" print(a == b) print(a is b) # 在python中, 默认会把数字, 字符串, 布尔值进行缓存 # 1.当我们在控制台的时候, 代码块与代码块之间的规则: # 1. 数字: -5 ~ 256之间的整数会被缓存 # 2. 字符串: # 长度小于等于1 会默认缓存 # 长度大于1 如果字符串中只有数字, 字母下换线缓存 # 乘法得到的字符串: # 1. 如果乘数是1. 和上面两个方案一致 # 2. 乘数不是1. 最终长度不能超过20 # 手动指定缓存 from sys import intern intern()制定缓存的内容 # 3. 布尔值 # 2. py文件里. 一个代码块内部. 只会缓存int, str, bool 也有自己的小数据池。 缓存的范围会比外面的代码块的数据池要大 # 1. 数字。都会缓存。 运算的结果不缓存(-5~256 会缓存) # 2. 字符串。 默认的字符串都缓存. 如果有乘法。 遵循上方的结论 # 3. 布尔值。 默认缓存 a = "alex@sb.com" # 5 b = "alex@sb.com" # 1 #编码 ''' 1. ASCII: 8bit 1byte 英文字母 数字 特殊字符. 2. GBK: 16bit 2byte 主要是存中文。日文, 韩文, 繁字体。 中文的特殊字符 中国 (abcd) 3. UNICODE: 32bit 4byte 4. UTF-8: 可变长度的unicode 英文: 8bit, 1byte 欧洲文字:16bit, 2byte 中文: 24bit, 3byte (abcd) GBK和UTF-8不能直接互换 转码 ''' # 在python2里面. 默认的编码是ASCII # 在python3中unicode是可以使用的。 默认用的就是Unicode. 代码用utf-8来存储 # 如果用unicode存储, 如果用utf-8 # s = "你好啊" # 看到的就是unicode # print(s) # 1. 编码. 把unicode转换成utf-8 # s = "刘伟很皮" # 12个字节 # abc = s.encode("UTF-8") # encode之后的结果是bytes类型 依然是原来的字符串 # print(abc) # b'数据' # 解码 # abc = b'\xe5\x88\x98\xe4\xbc\x9f\xe5\xbe\x88\xe7\x9a\xaf' # s = abc.decode("UTF-8") # 解码。 用什么编码, 就用什么解码 # print(s) # s = "赵瑞鑫" # print(s.encode("GBK")) # bs = b'\xd5\xd4\xc8\xf0\xf6\xce' # print(bs.decode("GBK")) # GBK的编码不能用UTF-8解码 # GBK的编码. 把这句话变成UTF-8 # bs = b'\xd5\xd4\xc8\xf0\xf6\xce' # # 先解码 # s = bs.decode("GBK") # # 重新编码 # bs2 = s.encode("UTF-8") # print(bs2)