流程的Python 第八章:对象引用、可变性和垃圾回收

时间:2022-12-10 00:03:59

前言:
对象与对象名称之间的区别。名称不是对象,而是单独的东西。

目录:

  1. 内容回顾
  2. 相关资料
  3. 阅读后感

正文:
一. 内容回顾
1.1 变量不是盒子
变量不是盒子,可视作便利贴

# 变量不是盒子,应该把变量视作便利贴
def node_01():
a = [1, 2, 3]
b = a
b.append(4)
print a
print b

# a = [1, 2, 3, 4]
# b = [1, 2, 3, 4]

1.2 标识、相等性和别名
比较数值: ==
比较标识: is

1.3 默认做浅复制

# 浅复制 copy 只拷贝父对象,不会拷贝对象的内部的子对象。
# 深复制 deepcopy 拷贝对象及其子对象
def node_02():
l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)
l1.append(100)
l1[1].remove(55)
print 'l1:', l1
print 'l2:', l2
l2[1] += [33, 22]
l2[2] += (10, 11)
print 'l1:', l1
print 'l2:', l2

输出结果:

/usr/bin/python /Users/jenkins/Desktop/Timen/Python/Demo/Study_0502_02.py
l1: [3, [66, 44], (7, 8, 9), 100]
l2: [3, [66, 44], (7, 8, 9)]
l1: [3, [66, 44, 33, 22], (7, 8, 9), 100]
l2: [3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]

Process finished with exit code 0

参考解释图:
流程的Python 第八章:对象引用、可变性和垃圾回收

1.4 函数的参数作为引用时
Skip

1.5 del和垃圾回收
Python使用了垃圾回收器来自自动销毁那些不再使用的对象。每个对象都有一个引用计数,当这个计数为0时Python能够安全地销毁这个对象。

1.6 弱引用
弱引用是避免循环引用的一种方法,弱引用不记录引用计数。当一个对象只有弱引用时可能被垃圾回收器回收。

使用weakref模块,你可以创建到对象的弱引用,Python在对象的引用计数为0或只存在对象的弱引用时将回收这个对象。

1.7 Python对不可变类型施加的把戏
Skip
Note: 比较字符串或者整数是否相等时,应该用==,而不是is

二. 相关资料
2.1 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用。如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝。

2.2 Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。通过“分代回收”(generation collection)以空间换取时间来进一步提高垃圾回收的效率。

三. 阅读后感
本章节收获知识很多,主要有两点,第一:变量不是盒子,而是视为便利贴,也就是说变量和变量名称是不同的。第二:默认做浅复制,理解浅复制 copy() 和深复制 deepcopy() 之间的区别。

参考:
1. 图解 Python 深拷贝和浅拷贝
2. 深入分析 Python 的垃圾回收机制
3. Python弱引用使用介绍