示例代码

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)下的次层的结点,通过.访问结点的属性字典,每个对象都有一个属性字典,这样一层层进行访问,这样就形成了命名空间。

关于locals()、globals()以及作用域的一些感悟的更多相关文章

  1. day10-Python运维开发基础(函数嵌套、nonlocal声明局部变量、闭包、locals/globals、lambda表达式)

    1. 函数的嵌套与nonlocal 声明局部变量 # ### 函数的嵌套 """ 函数和函数之间可以互相嵌套: 嵌套在内层的叫做内函数 乔涛在外层的叫做外函数 " ...

  2. locals()和globals()

    都是获取当前作用域的内容: locals() 获取局部作用域的所有内容 函数内:获取locals()之前的,当前作用阈所有内容 函数外:获取打印前, 当前的作用域所有内容 在闭包内: 会把使用到的外层 ...

  3. 解读Python中 locals() 和 globals() 内置函数

    首先globals() 和 locals() 是作用于作用域下的内置函数,所以我将它们分为作用域类型的内置函数 1.作用域相关: 1)globals() # 返回全局作用域中的所有名字 2)local ...

  4. Python 基础之返回值与函数使用与局部变量和全局变量locals() 和 globals()

    一.函数的返回值 return return: 自定义返回值,返回到哪里? 返回到函数的[调用处]1.return 后面可以跟上六个标准数据类型,除此之外,可以跟上 类对象,函数,如果不写return ...

  5. Python globals() locals() vars() 三个内建函数的区别

    首先参考官方文档对这三个函数的介绍: 2. Built-in Functions – Python3.5 1.globals() 返回当前全局符号表, 通常是返回当前模块下的全局符号表, 比如全局内建 ...

  6. Python globals()和locals()比较

    Python的两个内置函数,globals()和locals() ,它们提供了基于字典的访问局部和全局变量的方式. globals()是可写的,即,可修改该字典中的键值,可新增和删除键值对. 而loc ...

  7. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  8. day 10 函数命名空间、函数嵌套和作用域

    1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...

  9. python之路--动态传参,作用域,函数嵌套

    一 . 动态传参(重点)  * ,  ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...

随机推荐

  1. Python中lambda用法

    lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允 ...

  2. SQL万能语句-经典操作

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  3. sqlmap用户手册 [详细]

    当给sqlmap这么一个url的时候,它会: 1.判断可注入的参数 2.判断可以用那种SQL注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些数据 sqlmap支持五种不同的注入模式: ...

  4. CSS实现文字和图片的水平垂直居中

    关于文字和图片的水平垂直居中,在前端界绝对算是一个老生常谈的问题了,尤其是垂直居中,什么千奇百怪的解法都能想的出来.下面我就总结一些比较常用的方法: 一.文本的水平垂直居中: 1.水平居中: 是不是很 ...

  5. matplotlib.pyplot.hist

    **n, bins, patches = plt.hist(datasets, bins, normed=False, facecolor=None, alpha=None)** ## 函数说明 用于 ...

  6. AngularJS高级程序设计读书笔记 -- 模块篇

    一. 模块基础 1. 创建模块 <!DOCTYPE html> <html ng-app="exampleApp"> <head> <ti ...

  7. 超链接访问过后hover样式就不出现的问题是什么?如何解决?

    被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H-A(link,visited,hover,active)

  8. Java垃圾回收总结

    基本概念 垃圾回收器(Garbage Collector )是JVM非常重要的一个组成部分,主要用于自动化的内存管理.相比手动的内存管理,自动化的内存管理大大简化了程序员的开发难度并且更加安全,避免了 ...

  9. bc计算A股上市新股依次涨停股价

    几年的股市可谓惨不忍睹,不提也罢.唯有打新中签的时候,心里稍微有那么一点点的补偿,于是内心就YY可以30板吗,可以40板吗.于是就写了个连板的bc程序,每次中签的时候就运行一下,然后尽情的YY,然而每 ...

  10. indexOf和lastIndexOf的使用

    indexOf()和 lastIndexOf()是返回位置index的两个方法:都是接收两个参数,其中,indexOf()方法从数组的开头(位 置 0)开始向后查找:lastIndexOf()方法则从 ...