1)动态类型
1.1)核心思想
1 | python中 "一切皆对象" .作为 "动态语言" ,python遵循 "对象与引用分离" 的核心思想. |
1.2)一切皆对象
12345 | 常见的变量,如整数、字符串、列表等,在python中一切皆为对象 a = 1 整数 1 为一个对象,是储存在内存中的实体. 对象名a为一个引用,我们不能直接接触到 "对象实体" ,只能通过引用指向去访问,引用可以随时指向一个新的对象. |
1.3)赋值操作:可变对象、不可变对象
12345678910111213 | 不可变数据对象:不能改变对象本身,只能改变引用的指向;如整形、字符串、元祖等 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)从动态类型看函数的参数传递
1234567891011121314151617 | 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)垃圾回收
123456789 | 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)分代回收
123456 | 存活越久的对象,处于信任和效率,越不可能在后面的程序中变为垃圾,所以减少垃圾回收扫描他们的频率. python将所有的对象分为 0 , 1 , 2 三代.所有新建的对象都是 0 带对象.当经过某一次垃圾回收,依然存活,那么它就被归入下一代对象. 参考 1.5 ,输出中包含 2 个 10 ,分别代表:每 10 次 0 代对象垃圾回收,会进行 1 次 1 代对象垃圾回收;每 10 次 1 代对象垃圾回收,会进行 1 次 2 代对象垃圾回收 我们在平时应该避免对 2 代对象频繁扫描:gc.set_threshold( 700 , 10 , 20 ) |