1.字符串intern机制

用了这么久的python,时刻和字符串打交道,直到遇到下面的情况:

a = "hello"
b = "hello"
print(a is b) #--->True
print(a == b) #---> True a = "hello world"
b = "hello world"
print(a is b) # ---> False
print(a == b) # --->True

咦,这是怎么肥事?我们知道 '=='是用来比较两个变量的字面值是否一致,而 'is'是用来比较前后两个变量是否根本就是同一对象,也就是指向同一个内存地址。好吧,不信这个邪,试试用id方法看一下各自的地址。

>> a = 'hello'
>>> b = 'hello'
>>> id(a)
4482507864
>>> id(b)
4482507864 >>> a = 'hello world'
>>> b = 'hello world'
>>> id(a)
4482504112
>>> id(b)
4482504176

果然是这样,前面的a,b共用对象了,而后面的a,b的就直接当新对象来处理了。一般来说,新对象建立都会直接开辟一个新的内存使用,但这样的就很容易占用资源,造成内存的浪费,所以python中建立了池化(intern)的概念,即对值相同的字符串对象只会保存一份,相当于共用一个字符串池,当需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

但是并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern。这也就是我们看到的,为什么后面的例子中的a,b还是以新对象来处理了。

2.整数对象的内存机制

无独有偶,对于数字这种常用的数据类型,也有这样一种类似机制:

a = 1
b = 1
print(a is b) # --->True
print(a == b) # ---> True a = 320
b = 320
print(a is b) # --->False
print(a == b) # --->True

难道是个位的整数就是共对象了?也并非如此,python规定了[-5,257)的范围内为小整数池,即这个范围的整数使用时不用再创对象,直接取来用就好。

而对于大整数还是当作正常对象处理,每次使用均创建⼀个新的对象。

最新文章

  1. iOS架构一个中型普通App的一些经验总结
  2. linux-windows资源共享
  3. [AS3.0] Error #1069: Property onBWDone not found on flash.net.NetConnection and there is no default value.解决办法
  4. linux 学习1
  5. ORACLE FAQ
  6. 用xib自定义UITableViewCell
  7. bzoj3926
  8. 细谈JavaScript中的书写规范
  9. uva-699 Not so Mobile (杠杆,巧妙递归)
  10. 如何查看和更改mysql数据库文件存放位置
  11. auto和bool
  12. 【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新
  13. 一个C#程序员学习微信小程序路由的笔记
  14. Windows中通过命令行启动打开Service 管理工具
  15. react初学之render返回加括号的问题
  16. 【NLP CS224N笔记】Lecture 2 - Word Vector Representations: word2vec
  17. week_one-python格式化输出
  18. 外机连接本机的虚拟机服务器_VM端口映射
  19. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
  20. redhat7.4+shell离线安装docker

热门文章

  1. Sessions in BSU
  2. loj #2024. 「JLOI / SHOI2016」侦查守卫
  3. 实现织梦dedecms百度主动推送(实时)网页抓取
  4. tomcat启动优化
  5. (转)Selenium-11: Execute JavaScript with JavascriptExecutor
  6. hdu3483 A Very Simple Problem 非线性递推方程2 矩阵快速幂
  7. Codeforces - 722C 区间合并
  8. UVA 10806
  9. Tcpdump命令抓包详细分析
  10. 理解 Spring 事务原理