python之is 和 == 的区别//编码和解码
一.is 和 == 的区别:
1 .id() 内存地址
2. == 比较 #比较两边的值
3. is 比较 #比较的是内存地址
数字,字符串,有小数据池
#数字小数据池 : -5~256
特点:节省内存
#.字符串中如果有特殊字符,那么不会添加到小数池中,他们的内存地址就不一样
字符串中单个*20以内他们的内存一样,超过20个就不会添加到小数据池;单个*以上内存地址就不一样
str : 1,不能有空格
2,长度不能超过20个字符
3,不能有特殊字符如:#$@...
1.id () 内存地址
1 # id() 内存地址 2 s = 'alex' 3 print(s,type(s),id(s)) 4 # alex <class 'str'> 35619648 5 # alex <class 'str'> 32146240
2.== 比较的是值
3. is 比较的是内存地址
3.1 列表,字典,元祖,set集合
1 # 列表、字典、元祖、set集合 2 l1 = [1,2,3] 3 l2 = [1,2,3] 4 print(l1 == l2) # True 5 print(id(l1),id(l2)) # 35680008 35679368 6 print(l1 is l2) #False
# 字符串、数字的特殊的。比较内存地址,pc看不出来,用cmd来查看s1 = 'alex '
3.2对于str 小数据池
# 范围
1.不能有空格。
2.长度不能超过20位。
3.不能有特殊字符。#@...
# 有空格指向的是False >>> i = 'a' >>> i1= 'a' >>> print(i is i1) True >>> s1 = 'alex ' >>> s2 = 'alex ' >>> print(s1 == s2) True >>> print(s1 is s2) False >>> i = 'a b' >>> i1= 'a b' >>> print(i is i1) False
# 超过20位则为False >>> i = 'a'*20 >>> j = 'a'*20 >>> print(i is j) True >>> i = 'a'*21 >>> j = 'a'*21 >>> print(i is j) False
1 # 有特殊字符也为False 2 >>> i = 'a@' 3 >>> j = 'a@' 4 >>> print(i is j) 5 False
3.3对于int 小数据池
#范围:
-5---256 创建的相同的数字,都指向同一个内存地址。
>>> i = 6 >>> i1= 6 >>> print(i is i1) True >>> i = 258 >>> i1= 258 >>> print(i is i1) False >>> i = -5 >>> i1= -5 >>> print(i is i1) True
# 我们发现,数字和字符串的数据地址是一样的. 列表和元组的数据地址是不一样的
.
二.编码和解码
encoude(编码方式) -----拿到明文编码后对应的字节t
decode(编码方式) -----将编码后的字节解码成对应的明文
1.python2中使用的是ASCII码,所以不支持中文,如果需要在python中更改编码,需要在中文的开始编写:
#-*- encoding:utf-8 -*-
编码回顾;
1.ASCII : 最早的编码,里面有英文大写字母,小写字母,数字,一些特殊字符,没有中文.
8 个bit(8位),1个 byte.
2.GBK : 中文国标码,里面包含了ASCII编码,1
16个bit,2个byte
3.unicode : 万国码,里面包含了全世界所有国家的文字编码
32个bit,4个byte,包含了ASCII
4.utf-8 : 可变长度的万国码,是Unicode的一种实现,最小字符占8位
英文:8bit 1byte
欧洲文字:16bit 2byte
中文:24bit 3byte
综上,除了ASCII码以外,其他信息不能直接转换。
在python3的内存中,在程序运行阶段使用的是unicode编码,因为unicode是万国码,什么内容都可以进行显示,那么在数据传输和存储的时候由于unicode比较浪费空间和资源,需要把unicode转存成UTF-8或者CBK进行存储,怎么转换呢,在python中可以把文字信息进行编码,编码之后的内容就可以进行传输了,编码之后的数据是bytes类型的数据,其实啊,还是原来的数据只是经过编码之后表现形式发生了改变而已。
bytes 的表现形式:
1,英文 b'alex',英文的表现形式和字符串没什么两样;
2,中文b'\xe4\xb8\xad',这是一个汉字的UTF-8的bytes表现形式;
# 编码: s = "alex" print(s.encode("utf-8")) # 将字符串编码成UTF-8,结果为:b'alex' print(s.encode("GBK")) # 将字符串编码成GBK,结果为:b'alex' s = "中" print(s.encode("UTF-8")) print(s.encode("GBK")) s1 = s.encode("UTF-8") # 中文编码成UTF-8,结果为:b'\xe4\xb8\xad' s2 = s.encode("GBK") # 中文编码成GBK,结果为:b'\xd6\xd0' # 解码: print(s1.decode("UTF-8")) #结果为:中 print(s2.decode("GBK")) #结果为:中 复制代码
注意:用什么进行编码就要什么进行解码。
记住:英文编码之后的结果是原字符串一致,中文编码之后的结果根据编码的不同,编码结果也不同,我们能肯定,一个中文UTF-8是3个字节。一个GBK的中文编码是2个字节。