失效链接处理 |
Python 学习笔记 第二版 PDF 下载
本站整理下载:
相关截图:
主要内容:
第 1 章 基本环境
1.1 虚拟机
Python 是⼀种半编译半解释型运⾏环境。⾸先,它会在模块 "载⼊" 时将源码编译成字节码 (Byte
Code)。⽽后,这些字节码会被虚拟机在⼀个 "巨⼤" 的核⼼函数⾥解释执⾏。这是导致 Python 性
能较低的重要原因,好在现在有了内置 Just-in-time ⼆次编译器的 PyPy 可供选择。
当虚拟机开始运⾏时,它通过初始化函数完成整个运⾏环境设置:
• 创建解释器和主线程状态对象,这是整个进程的根对象。
• 初始化内置类型。数字、列表等类型都有专⻔的缓存策略需要处理。
• 创建 __builtin__ 模块,该模块持有所有内置类型和函数。
• 创建 sys 模块,其中包含了 sys.path、modules 等重要的运⾏期信息。
• 初始化 import 机制。
• 初始化内置 Exception。 • 创建 __main__ 模块,准备运⾏所需的名字空间。
• 通过 site.py 将 site-packages 中的第三⽅扩展库添加到搜索路径列表。
• 执⾏⼊⼝ py ⽂件。执⾏前会将 __main__.__dict__ 作为名字空间传递进去。
• 程序执⾏结束。
• 执⾏清理操作,包括调⽤退出函数,GC 清理现场,释放所有模块等。
• 终⽌进程。
Python 源码是个宝库,其中有⼤量的编程范式和技巧可供借鉴,尤其是对内存的管理分配。个⼈
建议有 C 基础的兄弟,在闲暇时翻看⼀⼆。
1.2 类型和对象
先有类型 (Type),⽽后才能⽣成实例 (Instance)。Python 中的⼀切都是对象,包括类型在内的每
个对象都包含⼀个标准头,通过头部信息就可以明确知道其具体类型。
头信息由 "引⽤计数" 和 "类型指针" 组成,前者在对象被引⽤时增加,超出作⽤域或⼿⼯释放后减
⼩,等于 0 时会被虚拟机回收 (某些被缓存的对象计数器永远不会为 0)。 以 int 为例,对应 Python 结构定义是:
#define PyObject_HEAD \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
typedef struct _object {
PyObject_HEAD
10
} PyObject;
typedef struct {
PyObject_HEAD! ! // 在 64 位版本中,头⻓度为 16 字节。
long ob_ival;! ! // long 是 8 字节。
} PyIntObject;
可以⽤ sys 中的函数测试⼀下。
>>> import sys
>>> x = 0x1234! ! # 不要使⽤ [-5, 257) 之间的⼩数字,它们有专⻔的缓存机制。
>>> sys.getsizeof(x) # 符合⻓度预期。
24
>>> sys.getrefcount(x) # sys.getrefcount() 读取头部引⽤计数,注意形参也会增加⼀次引⽤。
2
>>> y = x! ! ! # 引⽤计数增加。
>>> sys.getrefcount(x)
3
>>> del y! ! ! # 引⽤计数减⼩。
>>> sys.getrefcount(x)
2
类型指针则指向具体的类型对象,其中包含了继承关系、静态成员等信息。所有的内置类型对象都
能从 types 模块中找到,⾄于 int、long、str 这些关键字可以看做是简短别名。
>>> import types
>>> x = 20
>>> type(x) is types.IntType! ! # is 通过指针判断是否指向同⼀对象。
True
>>> x.__class__! ! ! ! # __class__ 通过类型指针来获取类型对象。
<type 'int'>
>>> x.__class__ is type(x) is int is types.IntType
True
>>> y = x
>>> hex(id(x)), hex(id(y))!! ! # id() 返回对象标识,其实就是内存地址。
('0x7fc5204103c0', '0x7fc5204103c0')
11
>>> hex(id(int)), hex(id(types.IntType))
('0x1088cebd8', '0x1088cebd8')
除了 int 这样的固定⻓度类型外,还有 long、str 这类变⻓对象。其头部多出⼀个记录元素项数量
的字段。⽐如 str 的字节数量,list 列表的⻓度等等。
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size; /* Number of items in variable part */
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
有关类型和对象更多的信息,将在后续章节中详述。
|