Python之作用域
作用域测试例子:
>>> a = 10
>>> def test():
... a = 20
... print a
...
>>> a
10
>>> test()
20
>>> a #执行test之后,a的值还是10,没有变
10
这里涉及作用域问题。
作用域
函数形参和内部变量都存储在locals名字空间中。
>>> def test(a,*args,**kwargs):
... s = "Hello test!"
... print locals()
...
>>> test(1,"a","b",x=10,y="hi")
{'a': 1, 's': 'Hello test!', 'args': ('a', 'b'), 'kwargs': {'y': 'hi', 'x': 10}}
除非使用global、nolocal特别声明,否则在函数内部使用赋值语句,总是在locals名字空间中新建一个对象关联。注意:赋值是指名字指向新的对象,而非通过名字改变对象状态。
回过头来看看上面的例子:
>>> a = 10
>>> def test():
... a = 20
... print a
...
>>> a
10
>>> test() #两个x指向不同的对象
20
>>> a #外部变量没有被修改
10
如果仅仅是引用外部变量,那么按LEGB顺序在不同作用域查找该名字。
名字查找顺序:
locals ->enclosing function ->global ->__builtins__
>>> a = 10
>>> locals()
{'a': 10, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7f1ce69ff578>, '__name__': '__main__', '__doc__': None}
>>>
>>> def test():
... a = 20
... print locals()
... print globals()
...
>>> globals() #和locals相同
{'a': 10, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7f1ce69ff5f0>, '__name__': '__main__', '__doc__': None}
>>> test()
{'a': 20} #locals只有形参
{'a': 10, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7f1ce69ff5f0>, '__name__': '__main__', '__doc__': None}
*locals:函数内部名字空间,包括局部变量和形参
*enclosing function:外部嵌套函数的名字空间
*globals:函数定义所在模块的名字空间
*__builtins__:内置模块的名字空间
如果想将外部名字关联到一个新对象,就需要使用global关键字,指明要修改的是globals空间。
>>> a = 10
>>> def test():
... global a #声明a,b是globals名字空间中的
... global b
... a = 20
... b = 30
... print "a in test= ",a
... print "b in test=",b
...
>>> globals()
{'a': 10, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7f1ce69ff2a8>, '__name__': '__main__', '__doc__': None}
>>> test()
a in test= 20
b in test= 30
>>> globals()
{'a': 20, 'b': 30, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7f1ce69ff2a8>, '__name__': '__main__', '__doc__': None}
>>> if True:
... a = 10
...
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'a': 10, '__package__': None}
>>> if False:
... b = 10
...
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'a': 10, '__package__': None}
>>> def test():
...
KeyboardInterrupt
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
因为b变量对应的分支是False,不会产生b变量,而a不同,a已经在globals存在,故使用a没有问题,而使用b会出现错误。
Python之作用域的更多相关文章
- Python的作用域
Python的作用域 转自:http://www.cnblogs.com/frydsh/archive/2012/08/12/2602100.html Python是静态作用域语言,尽管它自身是一个动 ...
- 详解Python的作用域和命名空间
最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己 ...
- python变量作用域
[python变量作用域] 几个概念: python能够改变变量作用域的代码段是def.class.lamda. if/elif/else.try/except/finally.for/while 并 ...
- Python 变量作用域 LEGB (上)—— Local,Global,Builtin
Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...
- Python 变量作用域与函数
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Python 变量作用域 LEGB (下)—— Enclosing function locals
上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...
- [Python] 命名空间&作用域
Python的类语句不会创建实例 类会创建命名空间,通过对象访问类的属性和方法 类不会创建作用域,对方法和属性的引用必须加以限定(如在方法中必须通过self引用实例的属性) class My1(): ...
- python的作用域、globals()-全局变量 和 locals()-局部变量
在python中,函数会创建一个自己的作用域,也称为为命名空间.当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 我们自己定义的全局变量均在python内建的globals()函数中 ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- Python 之作用域和名字空间
作用域与名字空间 Python有一个核心概念是名字空间(namespace),namespace是一个name到object 的映射关系,Python有很多namespace,因此,在代码中如果碰到一 ...
随机推荐
- ASP.NET没有魔法——ASP.NET MVC 与数据库之EntityFramework配置与连接字符串
前几篇文章中介绍了如何使用Entity Framework来操作数据库,但是对EF的配置.连接字符串的指定仍然存在一些疑问. 本章将对EF的配置进行介绍. EF可以通过两种方式来实现配置,分别是代码方 ...
- ZOJ2975 伪数组压缩+组合数
Kinds of Fuwas Time Limit: 2 Seconds Memory Limit:65536 KB In the year 2008, the 29th Olympic G ...
- Java视频扩展知识 线程池的了解
Java视频扩展知识 线程池的了解 1.简单介绍: Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的 ...
- 分页查询不知你是否真正的懂和PHP的正则的应用和一些性能优化
一.不废话太多 直接进入例子. 1 问题: 有一张收藏表,里面存储的是用户和图书ID.数据量为1亿.现在要求分页获取所有用户ID(不重复),写下你的sql语句. 表结构大致如下: ...
- JAVAEE企业级应用开发浅谈第一辑
不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...
- 博客发在win10.me
看到了http://www.win10.me/?page_id=58 说可以把自己的文章投给win10.me 我试试 抱着没有的心态 居然可以 我联系九幽,和他们说我写了很多博客,质量不好,他们说好 ...
- C# 6.0 $"Hello {csdn}"
"hello $world"的格式化字符串是指把字符串中一个单词,以一个标示开头.可以代换为单词所指的变量. 这个在jq有,而C#string的格式只能用格式的字符占位符,格式的字 ...
- win10 uwp smms图床
本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...
- mybatis逆向工程
一.背景 在实际开发中我们会自己去写mapper映射文件,接口,数据库表对应的实体类,如果需求任务比较少,咱们还可以慢慢的一个一个去写,但是这是不现实的,因为在工作中我们的任务是很多的,这时mybat ...
- Java基础-Eclipse环境搭建(02)
Eclipse工具 IDE(Integrated Development Environment)集成开发环境集成了编写功能,分析功能,编译功能一体化的开发软件. 调试功能等,其中编译在保存时运行(即 ...