恩怨、编码的详解"/>
is与==的恩怨、编码的详解
一、is和==的区别:
1、id()函数
通过id()可以查看到⼀一个变量表⽰的值在内存中的地址.
#字符串 a1 = "alex" a2 = "alex" print(id(a1),id(a2)) #2250772541544 2250772541544 #int a1 = 123 a2 = 123 print(id(a1),id(a2)) #2004253536 2004253536 #bool a1 = True a2 = True print(id(a1),id(a2)) #2003759264 2003759264 #字符串、int、bool等的数据地址都是一样的
#列表 a1 = ["张无忌","周芷若"] a2 = ["张无忌","周芷若"] print(id(a1),id(a2)) #2028760057352 2028760058056 #元组 a1 = ("扶摇","杨幂") a2 = ("扶摇","杨幂") print(id(a1),id(a2)) #1494052752008 1494052752072 #字典 a1 = {"楚乔":"赵丽颖","宇文玥":"林更新"} a2 = {"楚乔":"赵丽颖","宇文玥":"林更新"} print(id(a1),id(a2)) #1620881530672 1620881530744
#列表、元组、字典等数据地址都不一样
#结果⼀致, 但是在终端中是不⼀致的. 所以在python中,命令行代码和py文 件中的代码运行的效果可能是不一样的
#⼩数据池(常量池): 把我们使用过的值存储在小数据池中.供其他的变量使用. 小数据池给数字和字符串串使用, 其他数据类型不存在.
对于数字: -5~256是会被加到小数据池中的. 每次使用都是同一个对象. 对于字符串:
1. 如果是纯文字信息和下划线. 那么这个对象会被添加到小数据池
2. 如果是带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的
3. 如果是单一字⺟母*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加 到小数据池中
#注意(一般情况下): 在py⽂文件中. 如果你只是单纯的定义一个字符串. 那么一般情况下都是会 被添加到小数据池中的.
我们可以这样认为: 在使用字符串的时候, python会帮我们把字符串 进行缓存, 在下次使用的时候直接指向这个字符串即可. 可以节省很多内存.
2、==判断两边的值 #双等表⽰的是判断是否相等, 注意. 这个双等比较的是具体的值.⽽不是内存地址
3、is 判断内存的地址
id()和is有什么关系呢. 注意. is比较的就是id()计算出来的结果. 由于id是帮我 们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址. 最终我们通过is可以查看两个变量使⽤用的是否是同一个对象.
a1 = "杀阡陌" a2 = "杀阡陌" print(a1 == a2) #True print(a1 is a2) #True # 原因是有小数据池的存在 导致两个变量指向的是同一个对象 a1 = [1,2,3] a2 = [1,2,3] print(a1 == a2) #True 值是一样的 print(a1 is a2) #True 内存地址是不一样的
编码的回顾:
1、ASCII:有字母的大小写,数字,特殊字符。8bit,1byte
2、GBK:中文,16bit,2byte,兼容ASCII
3、unicode:万国码,32bit,4byte,兼容ASCII
4、utf-8:长度可变的unicode。英文:8bit,1byte。欧洲:16bit,2byte。中文:24bit,3byte。
python2和python3的区别
python2: python2中默认使⽤的是ASCII码. 所以不⽀持中⽂. 如果需要在Python2中更改编码. 需要在⽂件的开始编写:# -*- encoding:utf-8 -*
- 或coding=utf-8
python3:在python3的内存中. 在程序运⾏阶段. 使⽤的是unicode编码. 因为unicode是万国码. 什么内容都可以进⾏显⽰. 那么在数据传输和存储的时候由于unicode比较浪费空间和资源. 需要把 unicode转存成UTF-8或者GBK进⾏存储. 怎么转换呢. 在python中可以把⽂字信息进⾏编码. 编码之后的内容就可以进⾏传输了了. 编码之后的数据是bytes类型的数据.其实啊. 还是原来的 数据只是经过编码之后表现形式发⽣了改变⽽已.
bytes数据类型:表现形式:1. 英⽂ b'alex' 英⽂的表现形式和字符串没什么两样
2. 中⽂ b'\xe4\xb8\xad' 这是⼀个汉字的UTF-8的bytes表现形式
二、encode: 编码 ( encode()编码之后的内容是bytes类型的数据)
s = "alex" print(s.encode("utf-8")) #将字符串改为UTF-8 print(s.encode("GBK")) #将字符串改为GBK #结果:b'alex'b'alex's = "中" print(s.encode("utf-8")) #将字符串改为UTF-8 print(s.encode("GBK")) #将字符串改为GBK #结果:b'\xe4\xb8\xad'b'\xd6\xd0' #记住: 英⽂编码之后的结果和源字符串一致. 中⽂编码之后的结果根据编码的不同. 编码结果 也不同. 我们能看到.
⼀个中⽂的UTF-8编码是3个字节. ⼀一个GBK的中⽂文编码是2个字节. 编码之后的类型就是bytes类型.
在⽹络传输和存储的时候我们python是保存和存储的bytes类型. 那么在对⽅方接收的时候. 也是接收的bytes类型的数据.
我们可以使用decode()来进⾏解码操作. 把bytes类型的数据还原回我们熟悉的字符串:
三、decode:解码:
s = "我是张无忌" print(s.encode("utf-8")) #编码 结果:b'\xe6\x88\x91\xe6\x98\xaf\xe5\xbc\xa0\xe6\x97\xa0\xe5\xbf\x8c's1 = b'\xe6\x88\x91\xe6\x98\xaf\xe5\xbc\xa0\xe6\x97\xa0\xe5\xbf\x8c' print(s1.decode("utf-8")) #解码 结果:我是张无忌
四、编码和解码的时候都需要制定编码格式.
s = "我喜欢碧瑶" bs = s.encode("GBK") #获取到GBK文字 #把GBK转换成UT-8,首先把GBK转换成unicode.也就是需要解码 print(bs) ss = bs.decode("GBK") #解码 print(ss) #从新编译成utf-8 bss = s.encode("utf-8") #从新编码 print(bss)
转载于:.html
更多推荐
is与==的恩怨、编码的详解
发布评论