首先必须要提一下python程序执行过程中变量的查找规则

较官方的查找机制是:

局部作用域--外部函数作用域--全局作用域--内建函数作用域

其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是一个封装好的实例函数,

它的内部变量一般在函数外部无法获取到

什么是局部作用域,外部函数作用域和全局作用域?

1. 局部作用域

指的是函数内部的作用域

例如:

def  fn(a,b,c):

d=1

process

函数内的变量d位处的作用域就是函数的内部作用域,另外给fn()传入的参数a,b,c也位于函数内部的作用域内,

函数一旦调用完毕就会在内存中销毁

2. 外部函数函数作用域

例如:

def  fn1():

e=1

def  fn2():

pass

变量e所在的区域,外有fn1包裹,下有fn2函数,变量e所在的作用域就为外部函数作用域,外部函数作用域可以有

多个,这取决于函数有多少层嵌套

3. 全局作用域

例如:

f=1

def  fn1():

e=1

def  fn2():

pass

(此例在2.中例子基础上增加了变量f)

可见,变量f所在的作用域就是全局作用域,就是没有被函数包裹(即在所有函数之外)的作用域

为什么要区分局部变量和全局变量:

1. 避免变量名的冲突,因为python是一种类型较弱的语言,变量可以随时被赋值和修改为各种类型的数据,

这样容易引起命名上的冲突,局部变量和全局变量的区分使得这种冲突得到缓解

2. 为了提高效率,减少内存的占有,python规定局部变量在函数调用完之后就删除,而全局变量则不会删除

在谈及变量的命名空间这个话题必须要知道的两个语句:

global语句和nonlocal语句

global语句

一般条件下,全局作用域内定义的变量在局部变量内是无法修改的,而global语句则例外,

它在函数内部声明一个变量是全局内的变量,需要调用时去全局寻找,因此可以改变全局变量

注意:

要在函数内部声明这个变量,则在全局作用域中要事先定义(赋值)这个变量,同时在这个函数

的局部作用域内不能存在相同变量名的变量,否则程序会出错

nonlocal语句

这个语句跟global语句的功能有些类似,区别在于它是在在局部作用域内改变外部函数作用域的变量

那么在实际应用中这两个语句到底有什么用呢?

举两个简单的例子

1.

L=[]        #全局变量--一个列表

while   True:    #此处暂且定义一个死循环,可以根据实际修改循环条件

def  fn1():

  global L    #在函数内部给列表添加数据

L.append('abc')   #abc只是一个例子,每次调用fn1()都可以增添不同数据

在循环内每次调用fn1函数都可以往列表中增添‘abc’字符串,如果L列表定义在函数内部,

则每次调用函数都会初始化列表L,就没有意义了。所以global就有这么一个作用--实现

全局变量在函数内部的修改。

2.

a=0

def fn2():

global a

a+=1

process

fn2()

fn2()

这个例子反映global语句的作用是记录函数fn2函数被调用的次数,每次调用fn2函数,a都会自增1

在函数外部可以根据变量a的值知道fn2函数被调用了多少次

nonlocal语句的用法和global语句的用法差不多,读者可以依样画葫芦,敲敲代码就知道怎么用了,

我在这里就不赘述了

python变量的命名空间的更多相关文章

  1. Python变量作用域(一)

    在一个程序中使用变量名时,Python创建.改变或者查找变量名都是在所谓的命名空间中进行的.作用域指的就是命名空间. Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用.由于变 ...

  2. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

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

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

  4. Python 变量作用域与函数

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

  5. 13.Python中的命名空间是什么

    Python中的命名空间是什么? In Python,every name introduced has a place where it lives and can be hooked for. T ...

  6. Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  7. Python变量、数据类型6

    1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...

  8. Python变量类型

    Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...

  9. C与Python变量的区别

    C中变量有类型,代表一定内存. 而Python变量只是封装过的指针,没有类型.如果不指向对象,就没有意义,更谈不上类型. python中 a=b,和C中 a=b是完全不同的两个操作.前者只是指针(引用 ...

随机推荐

  1. ubuntu 16.04 下更换boost版本

    如果是新机器,没装过boost,那么直接一条命令 sudo apt-get install libboost-all-dev 头文件一般安装在 /usr/include 下面有一个目录boost,里面 ...

  2. thinkpad的E480安装ubuntu后wifi无法使用问题解决

    买了新电脑,安装ubuntu新系统之后,遇到了一个比较麻烦的问题,在ubuntu中,无法使用wifi. 用新产品就是要当小白鼠啊,查了一下资料,发现这个使用的rtl8821ce的wifi芯片,该wif ...

  3. Linux - 获取命令帮助信息

    Manual Page Chapter List 1:所有用户可以操作的指令或可执行文件 2:系统核心调用的函数与工具 3:子调用,常用的函数与函数库 4:设备,硬件文件说明,通常是/dev/的文件 ...

  4. Windows系统CMD常用命令大全

    命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一 ...

  5. Windows 10安装Python 3 7成功打印Hello World!

    Python下载 Python最新源码,二进制文档,新闻资讯等可以在Python的官网查看到: Python官网:https://www.python.org/ 你可以在以下链接中下载 Python ...

  6. 重磅:Spring Boot 2.0 正式发布!

    Spring Boot 2.0 正式发布! 2018/03/01最新消息,传得沸沸扬扬的Spring Boot 2.0 正式发布了. 小编去看了下Spring Boot的官网,正式版本已经释放出来了! ...

  7. eclipse引入php源包

    首先安装这些yum install gcc gcc-c++ kernel-devel autoconf automake libtool bison re2c gdb 导入时,如果有这个报错的话 Pr ...

  8. DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)

    了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...

  9. ​​ ​​我的Java秋招面经大合集(包含BAT头条网易等公司)

    ​ 微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经 ...

  10. 判断 php 程序是通过什么方式运行的 (浏览器,还是命令行)

    php 程序既可以通过浏览器来访问(一般是 apache.nginx等服务器), 也可以通过命令行来直接运行(cli 执行) 如果需要判断 当前程序是以何种方式来执行,应该怎样判断呢,使用:php_s ...