在一个程序中使用变量名时,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变量作用域(一)的更多相关文章

  1. python变量作用域

    [python变量作用域] 几个概念: python能够改变变量作用域的代码段是def.class.lamda. if/elif/else.try/except/finally.for/while 并 ...

  2. Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...

  3. Python 变量作用域与函数

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  4. Python 变量作用域 LEGB (下)—— Enclosing function locals

    上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...

  5. python——变量作用域及嵌套作用域

    ----------------------------------------------------------------------------- 前言-------------------- ...

  6. python 变量作用域、闭包

    先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...

  7. python变量作用域,函数与传参

    一.元组传值: 一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数 >>> def show( x, y ): ... p ...

  8. Python 变量作用域,闭包和装饰器

    from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...

  9. python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗

    python 深入理解 赋值.引用.拷贝.作用域 - 江召伟 - 博客园 https://www.cnblogs.com/jiangzhaowei/p/5740913.html a=[1,2,5]b= ...

随机推荐

  1. Windows Squid 安装配置

    squid 可以做反向代理将系统中相对静态的页面进行缓存和负责均衡,提高网站访问速度,增强网站可用性.安全性.用户访问Squid 反向代理服务器的 IP 地址,这样客户端的 URL 请求将被发送到反向 ...

  2. [转]LUA元表

    lua元表和元方法 <lua程序设计> 13章 读书笔记 lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在 ...

  3. webdriver如何定位多层iframe中元素

    在 web 应用中经常会出现 iframe 嵌套的应用,假设页面上有 A.B 两个 iframe,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B. iframe 中实际上是嵌 ...

  4. raw_input 和input的区别

    input它会根据用户输入变换相应的类型, raw_input则是不管用户输入什么类型的都会转变成字符型.

  5. Qt学习1

    Action 的用法 首先在头文件的 private 中加: 1 2 3 QMenu *fileMenu; QMenu *editMenu; QMenu *helpMenu; 1 2 3 4 5 6 ...

  6. python语言switch-case

    初学python语言,竟然很久才发现python没有switch-case语句,查看官方文档说是可以用if-elseif-elseif....代替. 讲真,这都不是问题.不就是一个条件判断吗.用if- ...

  7. JVM byte code

    http://blog.jamesdbloom.com/JVMInternals.html#constant_pool http://grepcode.com/file/repository.grep ...

  8. 不同操作系统上屏蔽oracle的操作系统认证方式

    windows系统上>如果不想用户通过操作系统验证方式登录,可以修改 sqlnet.ora文件,把 SQLNET.AUTHENTICATION_SERVICES=NTS 前面加#注释掉就可以了. ...

  9. jquery获得图片的真实大小

    $(function(){ var imgSrc = $("#image").attr("src"); getImageWidth(imgSrc,functio ...

  10. HA(High available)-Keepalived高可用性集群(双机热备)单点实验-菜鸟入门级

    HA(High available)-Keepalived高可用性集群   Keepalived 是一个基于VRRP虚拟路由冗余协议来实现的WEB 服务高可用方案,虚拟路由冗余协议 (Virtual ...