Python变量作用域(一)
在一个程序中使用变量名时,Python创建、改变或者查找变量名都是在所谓的命名空间中进行的。作用域指的就是命名空间。
Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用。由于变量名最初没有声明,Python将一个变量名
被赋值的地点关联为一个特定的命名空间。也即是说,在代码中给一个变量赋值的地方决定了这个变量将存在于哪个命名空间,也
就是它可见的范围。
函数除了打包代码之外,还为程序增加了一个额外的命名空间曾:在默认的情况下,一个函数的所有变量名都是与函数的命名空间
相关联的。这意味着:1、一个在def内定义的变量名能够被def内的代码使用。不能在函数的外部引用这样的变量名。
2、def之中的变量名与def之外的变量名并不冲突,即使是使用在别处的相同的变量名。一个在def之外被赋值的变量X与在这个def
之中的赋值的变量X是完全不同的变量。
函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域有如下的关系:
1、内嵌的模块是全局作用域。每个模块都是一个全局作用域。对于外部的全局变量就成为一个模块对象的属性,但是在一个模块中能够
像简单的变量一样使用。
2、全局作用域的作用范围仅限于单个文件。这里的全局指的是在一个文件的顶层的变量名仅对于这个文件内部的代码而言是全局的。
3、每次对函数的调用都创建了一个新的本地作用域。即是说,将会存在由那个函数创建的变量的命名空间。可以认为每一个def语句都定
义了一个新的本地作用域,但是因为Python允许函数在循环中调用自身,所以从技术上讲,本地作用域实际上对应的是函数的调用。换句话
说,每一个函数调用都创建了一个新的本地命名空间。递归在处理不能提前预知的流程结构时是一个有用工具。
4、赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。
5、所有其他的变量名都可以归纳为本地、全局或者内置的。
变量名解析遵循的原则:LEGB原则
1、当在函数中使用未认证的变量名时,Python搜索4个作用域【本地作用域(L),之后是上一层结构中def或lambda的本地作用域(E),
之后是全局作用域(G)、最后是内置作用域(B)】并且在第一处能够找到这个变量名的地方停下来。如果没有搜索到变量名,Python会报错。
2、当在函数中给一个变量名赋值时,Python总是创建或改变本地作用域的变量名,除非它已经在哪个函数中声明为全局变量。
3、当在函数之外给一个变量名赋值时,本地作用域与全局作用域是相同的。
全局变量的总结:
1、全局变量是位于模块内部的顶层的变量名
2、全局变量如果是在函数内部赋值的话,必须经过声明
3、全局变量在函数内部不经过声明也可以使用
根据要求的对象,工厂函数有时候也称作闭合,即一个能够记住嵌套作用域的变量值的函数,即使那个作用域已经不存在了。工厂函数有时用于需要
及时生成事件处理,实时对不同情况进行反馈的程序中。例如:
def maker(N):
def action(X):
return X**N
return action f = maker(2)
f(3)
运行结果:9
f(4)
运行结果:16 f = maker(3)
f(3)
运行结果:27
f(4):
运行结果:64
Python变量作用域(一)的更多相关文章
- 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 变量作用域、闭包
		
先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...
 - python变量作用域,函数与传参
		
一.元组传值: 一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数 >>> def show( x, y ): ... p ...
 - Python 变量作用域,闭包和装饰器
		
from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...
 - python  变量作用域  v.__sizeof__()  python  深复制  一切皆对象  尽量减少内存消耗
		
python 深入理解 赋值.引用.拷贝.作用域 - 江召伟 - 博客园 https://www.cnblogs.com/jiangzhaowei/p/5740913.html a=[1,2,5]b= ...
 
随机推荐
- Boundaries
			
Using Third-Party Code There is a natural tension between the provider of an interface and the user ...
 - [转]http://lua-users.org/wiki/LpegTutorial
			
Simple Matching LPeg is a powerful notation for matching text data, which is more capable than Lua s ...
 - 《JavaScript模式》第4章 函数
			
@by Ruth92(转载请注明出处) 第4章:函数 一.JavaScript 中函数的两个重要特征 函数是第一类对象,可以作为带有属性和方法的值以及参数进行传递: 函数提供了局部作用域,而其他大括号 ...
 - H5版俄罗斯方块(4)---火拼对战的雏形
			
前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...
 - UVA  572
			
这是一道纯正的深度优先搜索题目. 题目要求在有多少个不同的块,而不同块的定义则是,一个块中的任意一点和l另一个块中的任意一点不会相连,而相连的定义则是 在横向.纵向和对角线上相连. #include& ...
 - ubuntu QWT Qt
			
1,下载QWT 2,解压进入QWT的目录 3,qmake,生成makefile文件 4,编译,make 5,安装,make install ,需要root 安装好后会在 /usr/local 目录下有 ...
 - pt-ioprofile分析查看mysql的真实IO情况
			
针对IO密集型应用做系统调优的时候,我们通常都需要知道系统cpu 内存 io 网络等系统性能 和 使用率,结合应用本身的访问量,以及 mysql的性能指标来综合分析.比如说:我们将系统压力情况分为 ...
 - unity, 由scriptableObject创建.asset
			
由继承自scriptableObject的类X创建.asset文件. 假设类X的定义为: [System.Serializable] public class X : ScriptableObject ...
 - HOG matlab练习
			
matlab练习程序(HOG方向梯度直方图) HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图 ...
 - ruby md5加签验签方法
			
# md5签名def md5_sign(data,key) return OpenSSL::Digest::MD5.hexdigest(data+key)end # md5验签def md5_veri ...