• 关于locals()、globals()以及作用域的一些感悟


    示例代码

    i=6
    def foo():
    print locals()
    print globals()
    i=66
    print locals()
    print globals()
    class demo:
    i=666
    def f(self,x=99):
    print locals()
    print globals()
    self.i=6666
    print locals()
    print globals()
    print self.i
    print demo.i
    print i
    foo()
    demo().f()
    print globals()
    print locals()

     运行结果:

    {}
    {'__builtins__': <module '__builtin__' (built-in)>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}
    {'i': 66}
    {'__builtins__': <module '__builtin__' (built-in)>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}
    {'x': 99, 'self': <__main__.demo instance at 0x7fc75b412dd0>}
    {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <class __main__.demo at 0x7fc75b3fece8>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}
    {'x': 99, 'self': <__main__.demo instance at 0x7fc75b412dd0>}
    {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <class __main__.demo at 0x7fc75b3fece8>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}
    6666
    666
    6
    {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <class __main__.demo at 0x7fc75b3fece8>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}
    {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <class __main__.demo at 0x7fc75b3fece8>, '__file__': '/home/cyborg/PycharmProjects/untitled1/de.py', '__package__': None, 'i': 6, '__name__': '__main__', 'foo': <function foo at 0x7fc75b416cf8>, '__doc__': None}

    1.在模块级别上局部作用域与全局作用域相同,模块作用是最高的了,局部作用域就是全局的了。

    2.作用域是函数据以执行的环境的上下文,换句话说作用域是针对函数而言的,这样就有了全局(外部)和局部之分了,Python中一切都为对象,作用域从另一角度就是属性对象的集合。

    3.解释器在解析模块的过程中就会将模块中模块的属性以对象为单位加入到模块的最高的本地(全局)作用域中。

    4.作用域的结构就是一个树形结构,模块为根,形成了命名空间。

    5.函数的参数和函数内的变量(具有局部性)会加入局部作用域中。上述代码中类对象被加入了全局作用域,类生成的对象self被加入了函数的具部作用域,因为self是成员函数的一个参数。

            print self.i
            print demo.i
            print i

    这三行打印出的结果不同:

    第一行打印的局部变量self的属性

    第二行打印的是全局变量demo的属性

    第三行答应的是局部变量i

    放入作用域的中是每个结点(相当于root)下的次层的结点,通过.访问结点的属性字典,每个对象都有一个属性字典,这样一层层进行访问,这样就形成了命名空间。

  • 相关阅读:
    我的收藏
    VS2019错误:CS8370 的处理方法
    Win7设置远程访问(免密码)---- Cuba
    【收藏】关于AsposeDLL的使用
    VS Code 离线安装插件(中文包)
    WinCE在启动界面无法进入系统
    WinCE 清除远程连接缓存
    MySQL 创建远程访问用户
    MySQL 命令行(常用)操作数据库
    C# 制作关键字醒目显示控件
  • 原文地址:https://www.cnblogs.com/baishoujing/p/6362420.html
Copyright © 2020-2023  润新知