python
1)动态类型1.1)核心思想
- python中"一切皆对象".作为"动态语言",python遵循"对象与引用分离"的核心思想.
1.2)一切皆对象
- 常见的变量,如整数、字符串、列表等,在python中一切皆为对象
- a = 1
- 整数1为一个对象,是储存在内存中的实体.
- 对象名a为一个引用,我们不能直接接触到"对象实体",只能通过引用指向去访问,引用可以随时指向一个新的对象.
1.3)赋值操作:可变对象、不可变对象
- 不可变数据对象: 不能改变对象本身,
- 只能改变引用的指向;如整形、字符串、元祖等
- a = 5 b = a a = a + 2解析: 此时a = 7,
- b = 5.验证了不可变对象只能改变引用的指向,
- 各个引用相互独立,
- 互不影响.
- 可变数据对象: 引用其元素 (类似于L[0]),
- 改变对象的本身;如列表,字典等
- L1 = [1, 2, 3] L2 = L1 L1[0] = 100解析: 此时L1 = L2 = [100, 2, 3].验证了可变对象可以通过引用其元素,
- 改变对象本身
1.4)从动态类型看函数的参数传递
- def f(x):
- x = 100
- print x
- a = 1
- f(a)
- print a
- 解析:参数x是一个新的引用,指向a所指的对象.此处为不可变对象,引用a和x之间是相互独立的.参数x的操作不会影响引用a.
- def f(x):
- x[0] = 100
- print x
- a = [1,2,3]
- f(a)
- print a
- 解析:参照上一个例子,此处为可变对象传参,可以通过引用其元素改变对象本身.所以此处a和x都为[100,2,3]
1.5)垃圾回收
- python采取了一种简单的垃圾回收机制:即引用计数(from sys import getrefcount()).垃圾回收时,python不能进行其他任务,频繁的垃圾回收会大大降低python的工作效率.因此,python会在特定的情况下,自动启动垃圾回收机制.
- 通过gc模块查看垃圾回收阀值.
- import gc
- print gc.get_threshold()
- 输出(700,10,10)
- 解析:700是垃圾回收的阀值:内存中分配对象的次数-取消分配对象的次数=700;可以通过set.threshold()设置.
- 手动启动垃圾回收机制:gc.collect()
1.6)分代回收
- 存活越久的对象,处于信任和效率,越不可能在后面的程序中变为垃圾,所以减少垃圾回收扫描他们的频率.
- python将所有的对象分为0,1,2三代.所有新建的对象都是0带对象.当经过某一次垃圾回收,依然存活,那么它就被归入下一代对象.
- 参考1.5,输出中包含2个10,分别代表:每10次0代对象垃圾回收,会进行1次1代对象垃圾回收;每10次1代对象垃圾回收,会进行1次2代对象垃圾回收
- 我们在平时应该避免对2代对象频繁扫描:gc.set_threshold(700,10,20)
【python深入1】内存管理
python
原文:http://blog.51cto.com/kongxiaofa/2047065
来源: http://www.bubuko.com/infodetail-2416580.html