python的GC及动态类型语言介绍

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使用的引用计数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值