一、is 和 == 的区别
1.id() 通过id()我们可以查看到⼀一个变量表示的值在内存中的地址.
1 a = "刀下生,刀下死" 2 b = "刀下生,刀下死" 3 print(id(a)) 4 print(id(b))
>>>>>>>>>1654269828768
>>>>>>>>>1654269828768
>>>>>>>>>两个字符串地址相同
1 a = 123
2 b = 123
3 print(id(a),id(b))
>>>>>>>>>140708405633888 140708405633888
>>>>>>>>>两个数字地址也相同
1 a = ['yangxianqiang', 'pandeyong', 'hashiqi'] 2 b = ['yangxianqiang', 'pandeyong', 'hashiqi'] 3 print(id(a), id(b))
>>>>>>>>>2477147120200 2477147120264
>>>>>>>>>两个列表地址不同
1 a = ('abc', 2, 3, 4) 2 b = ('abc', 2, 3, 4) 3 print(id(a), id(b))
>>>>>>>>>2920342876392 2920342876392
>>>>>>>>>两个元组地址也相同
1 a = {1: 'xiazi', 2: 'yasuo', 3: 'feizi'} 2 b = {1: 'xiazi', 2: 'yasuo', 3: 'feizi'} 3 print(id(a), id(b))
>>>>>>>>>>2244009621904 2244009621976
>>>>>>>>>>两个字典地址也不相同
》》》》》》结论(仅供参考)
小数据池(常量池): 把我们使用过的值存储在⼩小数据池中.供其他的变量使用.
小数据池给数字和字符串使用, 其他数据类型不存在.
对于数字: -5~256是会被加到小数据池中的. 每次使用都是同一个对象.
对于字符串:
1. 如果是纯文字信息和下划线. 那么这个对象会被添加到小数据池
2. 如果是带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的
3. 如果是单一字母*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加 到小数据池中
注意(一般情况下): 在py文件中. 如果你只是单纯的定义一个字符串. 那么一般情况下都是会 被添加到小数据池中的. 我们可以这样认为: 在使用字符串的时候, python会帮我们把字符串串进行缓存, 在下次使用的时候直接指向这个字符串即可. 可以节省很多内存.
is : is比较的就是id()计算出来的结果. 由于id是帮我 们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址.
== : 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址
1 s1 = "哈哈" 2 s2 = "哈哈" 3 print(s1 == s2) # True print(s1 is s2) 4 # True 原因是有小数据池的存在 导致两个变量指向的是同一个对象 5 l1 = [1, 2, 3] 6 l2 = [1, 2, 3] 7 print(l1 == l2) # True, 值是⼀一样的 8 print(l1 is l2) # False, 值是假的
>>>>>>>>>>True
>>>>>>>>>>True
>>>>>>>>>>False
总结:
is 比较的是地址
== 比较的是值
二、编码的补充
1.编码回顾:
ASCII : 英文 8bit 1byte
GBK : 中文 16bit 2byte
Unicode : 万国码 32bit 4byte
utf-8 : 英文 8bit 1byte
欧洲 16bit 2byte
中文 24bit 3byte
2.bytes的表现形式:
1) : 英文 b'alex' 英文的表现形式和字符串没什么两样
2) : 中文 b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式
3.编码 : 字符串在传输时转化成bytes=> encode(字符集)来完成
1 s = "alex" 2 print(s.encode("utf-8")) # 将字符串编码成UTF-8 3 print(s.encode("GBK")) # 将字符串编码成GBK
>>>>>>>>>>b'alex'
>>>>>>>>>>b'alex'
1 s = "中" 2 print(s.encode("UTF-8")) # 中文编码成UTF-8 3 print(s.encode("GBK")) # 中文编码成GBK
>>>>>>>>>>b'\xe4\xb8\xad'
>>>>>>>>>>b'\xd6\xd0'
4.解码 : 我们可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串
1 s = "我叫李李嘉诚" 2 print(s.encode("utf-8")) # b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a' 3 print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解码
编码和解码的时候都需要制定编码格式
1 s = "我是⽂字" 2 bs = s.encode("GBK") # 我们这样可以获取到GBK的⽂文字 3 # 把GBK转换成UTF-8 4 # 首先要把GBK转换成unicode. 也就是需要解码 5 s = bs.decode("GBK") # 解码 6 # 然后需要进行重新编码成UTF-8 7 bss = s.encode("UTF-8") # 重新编码 8 print(bss)