函数和代码对象【转】
为了深入研究变量的作用域,有必要先了解一下函数(function)和代码(code)对象。让我们先看一个例子:
def f1(a,b): c = a+b return c def f2(): print "ok"
在IPython中运行之后,让我们查看函数f1()的一些属性:
>>> run variable_scope01.py >>> f1 <function f1 at 0x014BCE30> >>> type(f1) <type 'function'> >>> f1.func_ # 按Tab显示自动补全提示 f1.func_closure f1.func_defaults f1.func_doc f1.func_name f1.func_code f1.func_dict f1.func_globals
在Python中一切都是对象,函数也不例外。由上面的运行结果可知,函数对象的类型是function,并且函数的属性都以“func_”开头。
func_globals是一个保存所有全局对象的字典,函数通过此字典查找其中所有用到的全局对象。当然如果每个函数都拥有一个独立的全局对象字典,那就太浪费空间了。因此同一模块中定义的所有的函数共用一个全局字典。由下面的结果可知,f1()和f2()的func_globals属性是同一个对象:
>>> f1.func_globals is f2.func_globals True
func_code属性是一个代码(code)对象,它保存函数编译之后的字节码:
>>> f1.func_code <code object f1 at 01533C38, file "variable_scope01.py", line 3> >>> type(f1.func_code) <type 'code'> >>> f1.func_code.co_ # 按Tab显示自动补全提示 f1.func_code.co_argcount f1.func_code.co_freevars f1.func_code.co_cellvars f1.func_code.co_lnotab f1.func_code.co_code f1.func_code.co_name f1.func_code.co_consts f1.func_code.co_names f1.func_code.co_filename f1.func_code.co_nlocals f1.func_code.co_firstlineno f1.func_code.co_stacksize f1.func_code.co_flags f1.func_code.co_varnames
代码对象的属性都以“co_”开头。这些属性保存函数中与程序的代码相关的信息,而函数对象的属性则另外保存函数运行时所需要的环境信息。例如函数所能访问的全局对象保存在func_globals属性中,而函数所能访问的闭包中的对象保存在func_closure属性中。而函数中的局域变量名则保存在代码对象的co_varnames属性中:
>>> f1.func_code.co_varnames ('a', 'b', 'c')
稍后我们还会对函数和代码对象的属性进行详细介绍,这里读者只需要理解函数对象和代码对象的区别即可。
原文:http://hyry.dip.jp/tech/book/page/python/variable_scope_function_code.html