python的GC及动态类型语言介绍
这一次谈一下编程中的奇兵神器python,其实自己也是刚入门。
python是一门动态,强类型的语言,关于编程语言类型的讨论,可以看下这一个知乎讨论弱类型、强类型、动态类型、静态类型语言的区别是什么?
轮子哥vczh给的定义是:
强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double
弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double
静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。
动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。譬如说不能对一个数字a写a[10]当数组用。
pythond 的变量、对象和引用
上面说python是动态类型,变量的类型是在运行过程中确定的,所以变量的使用不需要代码声明。那么python的变量和对象是什么关系呢。
定义
python 学习手册cookbook 书上说的是:
- 变量是一个系统表的元素,拥有指向对象的连接的空间。
- 对象是分配的一块内存,有足够的空间去表示它们所代表的值。
- 引用是自动形成的从变量到对象的指针。
总而言之,变量在赋值的时候才创建,它可以引用任何类型的对象,并且必须在引用之前赋值。
例如代码a = 3;
那么python执行了三个动作:
1.创建一个对象来代表值3。
2.创建一个变量a,如果它还没有创建的话。
3.将变量与新的对象3相连接,也就是引用
类型属于对象,而不是变量
python既然是动态语言,所以下面代码同时出现在上下文中的是合法的
a = 3 # a为整数
a = "spam" # 现在a为字符串
a = 1.23 # 现在a为float
因为在Python中,情况很简单:变量名没有类型。就像前边所说的,类型属于对象,而不是变量名
python对象的分配
不同于静态语言C语言中的内存分配方式,对象在ELF中会放在堆栈或其他bss区。
python的变量对象大部分都是放在堆上,大的对象一定是在堆上的,小的(字母、数字)使用的是缓存机制。
PS:C语言内存分配,连接Link时候进程,ELF代码区域的介绍复习看之前的笔记CSAPP chap7
python的垃圾收集
既然python使用的是引用,不使用指针,对象都是放在堆上的,不需要回收。那么对象的回收肯定需要垃圾收集机制了。
垃圾回收在CSAPP 说过,之前的笔记是chap9.10
当时也说了一些算法,例如
- Mark-and-sweep collection (McCarthy, 1960) ,标志删除法,更有效
- - 实现可以看云风大神的blog
- Reference counting (Collins, 1960),引用计数,C++智能指针有用到
python使用的引用计数。