+20 投票
分类:Python编程与实践 | 用户: (5.8k 分)
a = "HHH"

id(a)

a += "EEE"

id(a)

上课老师讲到字符串相加其实是开辟的新的内存存储HHHEEE,用id(a)验证也确实如此,那么内存中的"HHH"还存在吗?还是已经被销毁了?

1个回答

+4 投票
用户: (45.4k 分)
采纳于 用户:
 
已采纳

此时保存“HHH”的地址还是存在的,Python有一套基于 引用计数 的垃圾回收机制,某个内存中的对象每被引用或绑定一次,引用计数都会加一,更具体的:

引用计数加一的情况:

  • 对象被创建,例如a=2
  • 对象被引用,b=a
  • 对象被作为参数,传入到一个函数中
  • 对象作为一个元素,存储在容器中

引用计数减一的情况:

  • 对象别名被显式销毁 del
  • 对象别名被赋予新的对象
  • 一个对象离开他的作用域
  • 对象所在的容器被销毁或者是从容器中删除对象

当某对象的引用计数值为0,那么它的内存就会被立即释放掉。

更详细的解释,可以参考 Python垃圾回收机制!非常实用 - 知乎 (zhihu.com)

如果想要第一时间清除该地址,可以显式调用del来强迫引用计数清零,即“对象别名被显式销毁 del”一条,例如:

b = a = "HHH"
a += "EEE"
del(b)

 

欢迎来到 爱可可Q&A ,有什么问题可以尽管在这里提问,你将会收到其他成员的热心回答。
...