一、is 和 == 介绍

1. is  比较的是两个对象的内存地址是否相同,它们是不是同一个对象。

2. ==  比较的是两个对象的内容是否相同。

在使用is前,先介绍Python的一个内置函数id(),它是用于查看对象在内存中的id.

  1. >>> a = 10
  2. >>> b = 'hello'
  3. >>> c= (1, 3, 5)
  4. >>> id(a); id(b); id(c)
  5. 4365573024
  6. 4372638160
  7. 4372561496

代码实例:

  1. # 数字
  2. >>> a = 5
  3. >>> b = 5
  4. >>> print(a==b)
  5. True
  6. >>> a is b
  7. True
  8.  
  9. #字符串
  10. >>> n1 = 'jason'
  11. >>> n2 = 'jason'
  12. >>> print(n1==n2)
  13. True
  14. >>> n1 is n2
  15. True
  16.  
  17. #列表
  18. >>> ls1 = [1, 3, 5, 7]
  19. >>> ls2 = [1, 3, 5, 7]
  20. >>> print(ls1==ls2)
  21. True
  22. >>> ls1 is ls2
  23. False
  24.  
  25. #元组
  26. >>> tu1 = (1, 2, 3)
  27. >>> tu2 = (1, 2, 3)
  28. >>> print(tu1 == tu2)
  29. True
  30. >>> tu1 is tu2
  31. False
  32.  
  33. #字典
  34. >>> info1 = {'name': 'jason', 'age': 25}
  35. >>> info2 = {'name': 'jason', 'age': 25}
  36. >>> print(info1 == info2)
  37. True
  38. >>> info1 is info2
  39. False
  40. >>> id(info1)
  41. 4372560920
  42. >>> id(info2)
  43. 4367493088
  44.  
  45. #集合

>>> 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。 

再看下面的一组列子:

  1. >>> a = -4 # 对象也为数字,为什么为False了
  2. >>> b = -4
  3. >>> a is b
  4. True
  5. >>> a = -6
  6. >>> b = -6
  7. >>> a is b
  8. False
  9. >>> a = -5
  10. >>> b = -5
  11. >>> a is b
  12. True
  13. >>> a = 257
  14. >>> b = 257
  15. >>> a is b
  16. False
  17.  
  18. >>> a = 'hello'
  19. >>> b = 'hello'
  20. >>> a is b
  21. True
  22. >>> new_a = a * 20
  23. >>> new_b = b * 20
  24. >>> new_a is new_b
  25. 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来完成.

代码示例:

  1. name = 'jason'
  2. name1 = name.encode('utf-8')
  3. print(name1)
  4. name2 = name.encode('GBK')
  5. print(name2)
  6.  
  7. s = '好'
  8. s1 = s.encode('utf-8') #utf-8编码,中文占3个字节
  9. print(s1)
  10. s2 = s.encode('GBK') #GBK编码, 中文占2个字节
  11. print(s2)
  12.  
  13. #执行结果:

b'jason'
  b'jason'
  b'\xe5\xa5\xbd'
  b'\xba\xc3'

英文编码之后的结果和源字符串一致. 中文编码之后的结果, 根据编码的不同, 得到的编码结果也不同. 从上方代码示例可以看出, 一个中文的utf-8编码是三个字节. 一个GBK的中文编码是两个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候, python保存和存储的就是bytes类型. 那么对方接收的时候, 也是接收的bytes类型的数据, 可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串.

  1. greeting = '你好世界'
  2. s = greeting.encode('utf-8')
  3. print(s)
  4. s1 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
  5. print(s1.decode('utf-8'))
  6.  
  7. #运行结果
  8. b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
  9. 你好世界
  10.  
  11. # \x分隔的, 每个\x和其后字符, 表示的是一个字节

编码和解码的时候都需要指定编码格式:

  1. s = '你好'
  2. s2 = s.encode('GBK')
  3. print('s2:', s2)
  4. # 把GBK转为utf-8, 首先要把GBK转为unicode,也就是需要解码
  5. s3 = s2.decode('GBK')
  6. # 重新编码成utf-8
  7. s4 = s3.encode('utf-8')
  8. print('s4:', s4)
  9.  
  10. # 运行结果
  11. s2: b'\xc4\xe3\xba\xc3'
  12. s4: b'\xe4\xbd\xa0\xe5\xa5\xbd'

以上就是关于编码解码的简单解释.

Python学习-is和==区别, encode和decode的更多相关文章

  1. python day- 6 is 和 ==的区别 encode 和 decode

    1.is 和  == 的区别. == 是由来判断左右两边的内容是否相等. is 是用来判断内存地址是否相同. 引进 id (   )函数 小数据池: 对于字符串 ,数字 ,bool 值进行 id()计 ...

  2. [转载] python必碰到的问题---encode与decode,中文乱码

    阅读来源: 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicod ...

  3. 配置python学习环境遇到的问题:[Decode error - output not utf-8]

    因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...

  4. Python—编码与解码(encode()和decode())

    编码与解码 decode英文意思是解码,encode英文原意是编码. Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化.编码是 unicode -> str ...

  5. 【python】浅谈encode和decode

    对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点. 编码的理解: 1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它 ...

  6. python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  7. 【python】python新手必碰到的问题---encode与decode,中文乱码[转]

    转自:http://blog.csdn.net/a921800467b/article/details/8579510 为什么会报错“UnicodeEncodeError:'ascii' codec ...

  8. python encode和decode函数说明【转载】

    python encode和decode函数说明 字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在p ...

  9. python的str,unicode对象的encode和decode方法

    python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...

随机推荐

  1. 【持续集成】GitLab CI + Docker 实现持续集成

    GitLab CI + Docker 实现持续集成 一.持续集成(Continuous Integration, CI)的基本概念 概述 在传统软件的开发中,代码的集成工作通常是在所有人都将工作完成后 ...

  2. SSH开发模式——Struts2(第三小节)

    struts2框架的知识点,虽然分了几个小节,感觉内容还是挺多的,但是你仅仅是入门了而已,想要进一步地提升自己,你得有一颗持之以恒的学习的心,最后的内容我都将在这篇博客中讲到,所以篇幅可能会有点长,希 ...

  3. odoo项目结构参数属性详解

    1.基础文件及目录结构 在认识odoo ORM框架前,先介绍一下odoo中模块目录结构.   data:存放模块预制数据i18n:存放国际化文件models:存放模型等py代码security:存放权 ...

  4. Java集合框架之HashMap浅析

    Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...

  5. MSIL实用指南-类相关生成

    一.创建class用MethodBuilder的DefineType方法,可以指定父类,得到一个TypeBuilder对象. 二.实现继承接口用TypeBuilder的AddInterfaceImpl ...

  6. BS/CS 区别

    转载自:https://www.cnblogs.com/chenmingjun 一.CS和BS含义: CS即Client/Server(客户机/服务器)结构.C/S结构在技术上很成熟,它的主要特点是交 ...

  7. WebApi使用OAuth2认证

    本篇文章实现了四种认证方式中的客户端模式和密码模式,未实现token持久化 未介绍OAuth2的相关概念,全部是干货,可自己在网上搜索OAuth2相关知识,在这不做过多阐述 一.引用OAuth2所需的 ...

  8. Python编程习惯

  9. POJ 2643 Election map

    POJ 2643 Election 第一次写博客,想通过写博客记录自己的ACM历程,也想解释下英文题目,写些自己的理解.也可以让自己以后找题目更加方便点嘛.ElectionTime Limit: 10 ...

  10. poj 1753 Flip Game(暴力枚举)

    Flip Game   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 52279   Accepted: 22018 Des ...