zoukankan      html  css  js  c++  java
  • 函数和代码对象【转】

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

  • 相关阅读:
    JAVA规范
    JMS开发指南
    JMS异步消息机制
    大型系统中使用JMS优化技巧–Sun OpenMQ
    02.MyBatis配置文件详解
    elasticsearch.yml配置文件
    04.ActiveMQ与Spring JMS整合
    01.MyBatis入门
    03.JMS深入
    02.JMS基础
  • 原文地址:https://www.cnblogs.com/olivetree123/p/5067010.html
Copyright © 2011-2022 走看看