一、is 和 == 介绍
1. is 比较的是两个对象的内存地址是否相同,它们是不是同一个对象。
2. == 比较的是两个对象的内容是否相同。
在使用is前,先介绍Python的一个内置函数id(),它是用于查看对象在内存中的id.
>>> a = 10 >>> b = 'hello' >>> c= (1, 3, 5) >>> id(a); id(b); id(c) 4365573024 4372638160 4372561496
代码实例:
# 数字 >>> a = 5 >>> b = 5 >>> print(a==b) True >>> a is b True #字符串 >>> n1 = 'jason' >>> n2 = 'jason' >>> print(n1==n2) True >>> n1 is n2 True #列表 >>> ls1 = [1, 3, 5, 7] >>> ls2 = [1, 3, 5, 7] >>> print(ls1==ls2) True >>> ls1 is ls2 False #元组 >>> tu1 = (1, 2, 3) >>> tu2 = (1, 2, 3) >>> print(tu1 == tu2) True >>> tu1 is tu2 False #字典 >>> info1 = {'name': 'jason', 'age': 25} >>> info2 = {'name': 'jason', 'age': 25} >>> print(info1 == info2) True >>> info1 is info2 False >>> id(info1) 4372560920 >>> id(info2) 4367493088
#集合
>>> seta = set(['a', 'b', 'c'])
>>> setb = set(['a', 'b', 'c'])
>>> print(seta == setb)
True
>>> seta is setb
False
总结:
当对象为数字、字符串时,对象1 is 对象2为True;当对象为列表、元组、字典、集合时,对象1 is 对象2为False。
再看下面的一组列子:
>>> a = -4 # 对象也为数字,为什么为False了 >>> b = -4 >>> a is b True >>> a = -6 >>> b = -6 >>> a is b False >>> a = -5 >>> b = -5 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a = 'hello' >>> b = 'hello' >>> a is b True >>> new_a = a * 20 >>> new_b = b * 20 >>> new_a is new_b False
注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。
二、encode和decode
注意:
1) python2中默认使用的是ASCII码,所以默认不支持中文.
2) python3中默认使用的是unicode码
在Python的内存中, 在程序的运行阶段, 使用的是unicode编码. 因为unicode是万国码, 什么内容都可以显示, 但是在数据传输和存储的时候, 由于unicode比较浪费空间和资源, 需要把unicode转成UTF-8或GBK进行存储. 怎么转换呢, 在python中可以对文字信息进行编码, 编码之后的内容就可以进行传输了. 编码之后的数据是bytes类型的数据. 其实, 还是原来的数据, 只是经过编码之后, 表现形式发生了改变而已.
字符串在传输的时候转换成bytes, 由encode来完成.
代码示例:
name = 'jason' name1 = name.encode('utf-8') print(name1) name2 = name.encode('GBK') print(name2) s = '好' s1 = s.encode('utf-8') #utf-8编码,中文占3个字节 print(s1) s2 = s.encode('GBK') #GBK编码, 中文占2个字节 print(s2)
#执行结果:
b'jason'
b'jason'
b'xe5xa5xbd'
b'xbaxc3'
英文编码之后的结果和源字符串一致. 中文编码之后的结果, 根据编码的不同, 得到的编码结果也不同. 从上方代码示例可以看出, 一个中文的utf-8编码是三个字节. 一个GBK的中文编码是两个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候, python保存和存储的就是bytes类型. 那么对方接收的时候, 也是接收的bytes类型的数据, 可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串.
greeting = '你好世界' s = greeting.encode('utf-8') print(s) s1 = b'xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c' print(s1.decode('utf-8')) #运行结果 b'xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c' 你好世界 # x分隔的, 每个x和其后字符, 表示的是一个字节
编码和解码的时候都需要指定编码格式:
s = '你好' s2 = s.encode('GBK') print('s2:', s2) # 把GBK转为utf-8, 首先要把GBK转为unicode,也就是需要解码 s3 = s2.decode('GBK') # 重新编码成utf-8 s4 = s3.encode('utf-8') print('s4:', s4) # 运行结果 s2: b'xc4xe3xbaxc3' s4: b'xe4xbdxa0xe5xa5xbd'
以上就是关于编码解码的简单解释.