前言:
对象与对象名称之间的区别。名称不是对象,而是单独的东西。
目录:
- 内容回顾
- 相关资料
- 阅读后感
正文:
一. 内容回顾
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
参考解释图:
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弱引用使用介绍