首先,Python中的is就是判断地址是否相等(相当于Java中的==),Python中的==就是判断数值是否相等(相当于Java中的equals)。

看个简单的例子:

a = [1, 2, 3]
b = [1, 2, 3]
id(a)
Out[16]: 2531065911112
id(b)
Out[17]: 2531064874824
a == b
Out[18]: True
a is b
Out[19]: False

因为地址不同,但是元素是相同的。

但是会发现一些好玩的东西,比如:

a = 100
b = 100
id(a)
Out[22]: 140720205396832
id(b)
Out[23]: 140720205396832
a == b
Out[24]: True
a is b
Out[25]: True
a = 10000
b = 10000
id(a)
Out[29]: 2531066740880
id(b)
Out[30]: 2531066741104
a == b
Out[31]: True
a is b
Out[32]: False

我们发现上面两个结果竟然不同,怎么回事呢?

原来是因为Python中整型的复用机制:

在python的整型对象中,将-5~256(python源码中定义)这些整数对象放于小整数对象池中缓存。

python中除上述的小整数外其他称为大整数,创建时为其分配空间。

但创建两个相同的大整数时,会为其分配不同的地址空间。

同理针对字符串:

a = 'chenchi'
b = 'chenchi'
id(a)
Out[35]: 2531066870728
id(b)
Out[36]: 2531066870728
a == b
Out[37]: True
a is b
Out[38]: True

在创建字符串时,python会根据字符串长度判断是否创建字符串对象。在WIN32平台上,最大为2147483647,即2GB,大于该值不会创建字符串对象。

python字符串对象中,存在intern机制,即共享机制。对于空字符串,python只会在第一次使用时创建,后面使用时只会返回原来创建的对象(类似单例模式)。

对于应用了intern机制的字符串对象,会直接返回对象的引用。实际使用中,创建两个相同的字符串变量时,地址是相同的。

参考

https://blog.csdn.net/qq_33512078/article/details/78357773

最新文章

  1. Html5 实现灯笼绘制
  2. Linux--Ubuntu中文文件夹转英文
  3. XML文件解析DOM解析和SAX解析
  4. SQLite&&SharedPreferences&&IO读写Sdcard学习笔记
  5. 基于CAShapeLayer以及UIBezierPath的语音输入效果动画封装
  6. 使用Memcached、Spring AOP构建数据库前端缓存框架
  7. VS2005设置Release模式可调试
  8. Day1_PHP快速入门
  9. 教你爱上Blocks(闭包)
  10. Memcached和Redis简介
  11. iOS-RATreeView多层UITableViewCell展示【多级列表展开与收起】的使用
  12. Xss问题解决方案
  13. Python文件操作之把臂入林
  14. js前台计算两个日期的间隔时间
  15. 从前端角度看ajax如何保护接口的安全性
  16. [hyperscan] hyperscan 1到1.5 --!!
  17. javascript window对象属性和方法
  18. JAVA正确的四舍五入方法
  19. Centos7.0 配置docker 镜像加速
  20. django比较相等或者不相等的模板语法ifequal / ifnotequal

热门文章

  1. bzoj3545: [ONTAK2010]Peaks 重构树 主席树
  2. 洛谷.1782.旅行商的背包(背包DP 单调队列)
  3. Altium Designer Summer 09 Gerber 文件设置
  4. [HihoCoder1378]网络流二·最大流最小割定理
  5. redis清除缓存和连接远程服务器
  6. SpringMybatisMapper
  7. bzoj 2013 上升计数
  8. restful开发API
  9. Centos 7 安装 Mysql 5.5 5.6 5.7
  10. webstorm激活方法