示例代码

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. 浅谈Fastfds+nginx结合_单机

    一.环境 centos6.8 x64  IP:192.168.134.128 所需软件包: libfastcommon-1.0.7.zip,FastDFS_v5.05.tar.gz,nginx-1.7 ...

  2. django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...

  3. ztree学习笔记(一)

    在项目当中,经常会用到ztree树形插件,之前做的几个项目当中都用到了这个插件,感觉功能还是很强大的,而且在网上还找到了中文的API,因为项目中的树形结构不是自己做的,所以现在从头学习一下,并且记录一 ...

  4. 通过LOGBACK实现每个类、包或自定义级别

    项实现LOGBACK对每个包或者类或者通过自定义级别的方式实现自定义输出的日志进入制定的文件.查阅了很多资料,都没有找到行之有效的解决方案,直到看到了这篇文章http://www.360doc.com ...

  5. Tomcat 的 catalina.out 日志分割

    一.背景 Tomcat 的 catalina.out 日志量不断增加,占用空间较大,且默认是不滚动的.因此,需要对其进行日志分割,并进行清理. 本文选用 Cronolog 对其进行分割. 二.安装 1 ...

  6. linux中常用的命令

    1.向某个ip发送文件 scp name.tar root(身份)@ip:/lujing 2.重启系统 init 6 3.如果修改了ifcfg-eth0类似于网卡配置文件,修改网口,ip等设置: 需要 ...

  7. H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

    H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...

  8. python可视化--matplotlib

    matplotlib在python中一般会与numpy同时出现,解决一些科学计算和数据的可视化问题. matplotlib其实就是matlib在python中的实现,因此不会有太大的难度,而由于pyt ...

  9. 【Android Developers Training】 86. 基于连接类型修改您的下载模式

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. JQuery——banner旋转木马效果

    博主在浏览网页时无意间发现了一种banner图的轮播方式--像旋转木马一样的轮播方式,博主感觉非常新颖独特,经过查阅资料,观看某课网教程总算搞了出来的,其原理主要利用了JQuery代码实现,好了不多说 ...