函数和代码对象【转】

为了深入研究变量的作用域,有必要先了解一下函数(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 

原文地址:https://www.cnblogs.com/olivetree123/p/5067010.html