《Python精要》阅读笔记
几个重要的点,还不是很熟悉的地方。
一 引用计数与垃圾回收
1 一切对象都是引用计数的。当分配一个新的名字给一个对象或者将其放入一个容器(列表,元组或者字典)时,该对象的引用计数增加1.
a = 1 #分配新的名字,对象1的引用计数增加1
b = a #分配新的名字,对象1的引用计数增加1 或者b = 1 a,b是对同一个对象的引用
c = []
c.append(a) # 引用计数增加1 或者c.append(1)效果一样
区分什么是对象,什么是对象的引用。对象的引用名字也是一种对象,在python中,一切都是对象。
2 del语句,脱离变量作用域,或者变量被重新定义,都会导致引用计数减少1.
del a
b = 2
c[0] = 2
3 当一个对象的引用计数变为0时,该对象就会在适当的时机被垃圾回收器回收。
然而当出现相互引用时,似乎两个对象的计数永远都不会变为0.虽然两个对象都无法通过名字访问,但是计数器并没有减为0.针对这种情况,Python解释器会定期运行一个搜索器,去清除无法访问的对象。
二 引用和副本
1 对可变对象来说,改变它的一个引用,则它的其他引用都改变了
a = [1,2,3]
b = a
a[0] = -1 # b = [-1,2,3]
a.append(4) # b = [-1,2,3,4]
2 而对于不可变对象来说,改变对象的一个引用事实上是创建一个新对象了,对其他引用没有影响
a = (1,2,3)
b = a
b = [1,2,3]
此时a是a,b是b
3 浅拷贝与深拷贝
浅拷贝复制创建了一个新对象,但它包含的子元素仍然是原来对象的子元素的引用。
理解两点
1)复制创建了一个新对象
a = [1,2,[3,4]]
b = a[:] # 浅拷贝 复制了a中元素,但b和a不是同一个对象的引用,b是创建了一个新对象
所以
b.append(100) # a不会受到影响
2) 子元素仍然是原来对象的子元素的引用
b[0] = -1 # a不会改变,子元素是不可变对象,参看上1,2两点
b[2][0] = -3 # a改变,子元素是可变对象,参看1,2两点
三 一些技巧
apply()
lambda
map()
zip()
reduce()
filter()