《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()  

 

 

posted @ 2012-08-01 21:17  jinmengzhe  阅读(515)  评论(0编辑  收藏  举报