设为首页 加入收藏

TOP

python学习笔记(三)
2018-12-14 02:56:28 】 浏览:25
Tags:python 学习 笔记
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Agoni_xiao/article/details/78399322

Python的内存管理及对象

Python的内存机制

Python动态类型:

Python 语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python 仍然是一种解释型语言。在创建--也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。

Python的引用计数:

Python 使用了引用计数这一简单技术。也就是说Python 内部记录着所有使用中的对象各有多少引用一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用, 简称引用计数。当对象被创建时,就创建了一个引用计数, 当这个对象不再需要时,也就是说,这个对象的引用计数变为0 时,它被垃圾回收。


增加引用计数

1.对象被创建:x=4

2.另外的别人被创建:y=x

3.被作为参数传递给函数:foo(x)

4.作为容器对象的一个元素:a=[1,x,'33']

减少引用计数

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

2.对象的别名被显式的销毁:del x ;或者del y

3.对象的一个别名被赋值给其他对象:x=789

4.对象从一个窗口对象中移除:myList.remove(x)

5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

垃圾回收:

不再被使用的内存会被一种称为垃圾收集的机制释放。象上面说的,虽然解释器跟踪对象的引用计数, 但垃圾收集器负责释放内存。垃圾收集器是一块独立代码, 它用来寻找引用计数为0 的对象。它也负责检查那些虽然引用计数大于0 但也应该被销毁的对象。 特定情形会导致循环引用。

一个循环引用发生在当你有至少两个对象互相引用时,也就是说所有的引用都消失时, 这些引用仍然存在, 这说明只靠引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其它对象。作为引用计数的补充,垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来,试图清理所有未引用的循环。

python对象

在对象创建后,一个该对象的应用会被赋值给左侧的变量。

Python 使用对象模型来存储数据。构造任何类型的值都是一个对象。尽管Python 通常当成一种“面向对象的编程语言”,但你完全能够写出不使用任何类和实例的实用脚本。

内建类型:

1.Python 的三个特性:身份,类型和值。

身份:

每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址。您极少会用到这个值,也不用太关心它究竟是什么。

类型

对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。您可以用内建函数type()查看Python 对象的类型。因为在Python 中类型也是对象(还记得我们提到Python 是面向对象的这句话吗),所以type()返回的是对象而不是简单的字符串。

对象表示的数据项

2. 类型分类

a.标准类型:

数字(分为几个子类型,其中有三个是整型)

整型

布尔型

长整型

浮点型

复数型

字符串

列表

元组

字典

b.内建类型

类型

Null 对象(None)

文件

集合/固定集合

函数/方法

模块

类型对象和type对象:

描述一种类型所需要的信息不可能用一个字符串来搞定,所以类型不能是一个简单的字符串,这些信息不能也不应该和数据保存在一起,所以我们将类型定义成对象。所有类型对象的类型都是type,它也是所有Python类型的根和所Python 标准类的默认元类(metaclass)。

None(python的NULL对象)



Python 有一个特殊的类型,被称作 Null 对象或者 NoneType,它只有一个值,那就是 None。它不支持任何运算也没有任何内建方法。如果非常熟悉C 语言,和None 类型最接近的C 类型就是void,None 类型的值和C 的NULL 值非常相似(其他类似的对象和值包括Perl 的undef 和Java 的void 类型与null 值)。None 没有什么有用的属性,它的布尔值总是False

内部类型:

代码对象

代码对象是编译过的Python 源代码片段,它是可执行对象。通过调用内建函数compile()可以得到代码对象。代码对象可以被 exec 命令或 eva l()内建函数来执行。

代码对象本身不包含任何执行环境信息, 它是用户自定义函数的核心,在被执行时动态获得上下文。(事实上代码对象是函数的一个属性)一个函数除了有代码对象属性以外,还有一些其它函数必须的属性,包括函数名,文档字符串,默认参数,及全局命名空间等等。

帧对象

帧对象表示 Python 的执行栈帧。帧对象包含Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象,本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C 栈帧。用到帧对象的一个地方是跟踪记录对象。

跟踪记录对象:

当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有自己的处理程序,处理程序就可以访问这个跟踪记录对象。

切片对象:

当使用Python 扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引切片操作,包括步进切片,多维切片,及省略切片。。多维切片语法是 sequence[start1 : end1,start2 : end2], 或使用省略号,sequence[...,start1 : end1 ]. 切片对象也可以由内建函数slice()来生成。步进切片允许利用第三个切片元素进行步进切片,它的语法为sequence[起始索引 : 结束索引 : 步进值]



省略对象:

省略对象用于扩展切片语法中,起记号作用。这个对象在切片语法中表示省略号。类似Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True。

XRange()对象:

调用内建函数 xrange() 会生成一个Xrange 对象,xrange()是内建函数 range()的兄弟版本, 用于需要节省内存使用或 range()无法完成的超大数据集场合。



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【python教程】(4)python中的模.. 下一篇python 学习第一天

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目