zg手册 之 python2.7.7源码分析(5)-- python的作用域和名空间

在 python 中, module,作用域,名空间这几个概念与虚拟机的运行机制有紧密的联系,

这里先了解 module,作用域,和名空间,为后面分析虚拟机的运行做准备。

module

在python中一个文件对应是一个module,每个py文件被导入后都对应一个module对象。

这个对象包含有一个dict对象,保存着本py文件中对应的变量和函数的引用,

也保存从其他python文件(module)导入的变量或函数的引用。

名空间和作用域

python 有三个独立的名空间, local, global, builtin。

  1. builtin 是python解释器的全局名空间
  2. global 是module对象的全局名空间,保存着module中的变量和函数的引用
  3. local 对应是当前代码块的名空间,保存局部的变量和函数引用

在python文件中,每个代码块对应一个作用域,也对应一个名空间。

当使用变量或者函数的时候,按照名空间 local,global,builtin的顺序查找。

代码块是可以嵌套的,所以local名空间也是嵌套查找。

作用域的例子

#!/usr/bin/env python
# coding: utf-8
# test.py
# 全局作用域,定义变量a,函数show

a = ‘hello word‘

def show():
    # 函数 show 的局部作用域
    name = ‘show function‘
    def myhelp():
        # 函数 myhelp 的局部作用域
        # 使用全局作用域的变量a
        print a 
        # 使用 show 函数的局部作用域内的变量name
        print name

总结

  1. 代码块对应着作用域和名空间
  2. 名空间保存有作用域内的变量和函数引用
  3. 每个代码块对应着pyc字节码文件的一个PyCodeObject对象(见 zg手册 之 python2.7.7源码分析(4)-- pyc字节码文件

理解了上面的概念后,就可以深入理解虚拟机的运行原理了。

原文链接:zg手册 之 python2.7.7源码分析(5)-- python的作用域和名空间

时间: 2024-10-15 17:38:10

zg手册 之 python2.7.7源码分析(5)-- python的作用域和名空间的相关文章

zg手册 之 python2.7.7源码分析(4)-- pyc字节码文件

什么是字节码 python解释器在执行python脚本文件时,对文件中的python源代码进行编译,编译的结果就是byte code(字节码) python虚拟机执行编译好的字节码,完成程序的运行 python会为导入的模块创建字节码文件 字节码文件的创建过程 当a.py依赖b.py时,如在a.py中import b python先检查是否有b.pyc文件(字节码文件),如果有,并且修改时间比b.py晚,就直接调用b.pyc 否则编译b.py生成b.pyc,然后加载新生成的字节码文件 字节码对象

zg手册 之 python2.7.7源码分析(2)-- python 的整数对象和字符串对象

python 中的内置对象 python 中常用的内置对象有:整数对象,字符串对象,列表对象,字典对象.这些对象在python中使用最多,所以在实现上提供缓存机制,以提高运行效率. 整数对象 (PyIntObject) python 中的整数对象是不可变对象(immutable),即创建了一个 python 整数对象之后,不能再改变该对象的值. python 为创建整数对象提供了下面三种方法,其中 PyInt_FromString 和 PyInt_FromUnicode 内部也是调用 PyInt

zg手册 之 python2.7.7源码分析(3)-- list 对象和 dict 对象

list 对象 list 对象的定义 list对象内部是使用数组实现,在数组中存储的是指针,指向要保存的对象. allocated是list中数组的大小,ob_size是当前已经使用的数组大小. typedef struct {     // 可变长对象中有 ob_size,保存当前已经使用的数组大小     PyObject_VAR_HEAD     PyObject **ob_item; // 数组的指针     Py_ssize_t allocated; // 分配的数组长度 } PyLi

zg手册 之 python2.7.7源码分析(1)-- python中的对象

源代码主要目录结构 Demo: python 的示例程序 Doc: 文档 Grammar: 用BNF的语法定义了Python的全部语法,提供给解析器使用 Include: 头文件,在用c/c++编写扩展模块时使用 Lib: Python自带的标准库,用python编写的 Modules: 用c编写的内建模块的实现,zlib,md5 等 Objects: 内建对象类型的实现 list,dict 等 PC:      windows 平台相关文件 PCbuild: Microsoft Visual

[nginx源码分析]配置解析(http作用域)

分析完events后,开始分析http.sever.location模块. http上下文主要是创建三个用于保存每一个模块设置的变量结构,每个模块都可以保存变量到http三个数组指针中(main.server.location),每个模块的索引是模块的ctx_index变量指定在三个数组中的位置 核心代码: ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); //首先分配一个http上下文变量,里面是指针的指针,因为后面分配数组都是

Python2 基本数据结构源码解析

Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. PyStringObject 0x05. PyListObject 0x06. PyDictObject 0x07. PyLongObject 0x00. Preface 一切皆对象,这是Python很重要的一个思想之一,虽然在语法解析上有些细节还是不够完全对象化,但在底层源码里,这个思想还是贯穿

S5PV210-uboot源码分析-第一阶段

uboot源码分析1-启动第一阶段 1.starts.S是我们uboot源码的第一阶段: 从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口.所以_start符号所在的文件,就是我们整个程序的起始文件,_start所在处的代码就是我们整个程序的起始代码. 2.我们知道了程序的入口是_start这个符号,但是却不知道是在哪一个文件中,所以要SI进行查找搜索,点击SI的大R进行搜索

DPDK_API_rte_malloc源码分析

概念: librte_malloc库提供了一套用于管理内存空间的API接口,它管理的内存是hugepages上创建出来的memzone,而不是系统的堆空间.通过这套接口,可以提高系统访问内存的命中率,防止了在使用Linux用户空间环境的4K页内存管理时容易出现TLB miss. 接口函数: void? rte_malloc( void ?ptr, size_t size, unsigned align ):用来替代malloc,从内存的huge_page中分配所需内存空间,分配的空间未被初始化.

YII 的源码分析(二)

上一篇简单分析了一下yii的流程,从创建一个应用,到屏幕上输出结果.这一次我来一个稍复杂一点的,重点在输出上,不再是简单的一行"hello world",而是要经过view(视图)层的处理. 依然是demos目录,这次我们选择hangman,一个简单的猜字游戏.老规则,还是从入口处开始看. index.php: <?php // change the following paths if necessary $yii=dirname(__FILE__).'/../../frame