全局与局部变量的引用

(a)locals
(b)globals

这里还需要在补充2个关键字一起比较学习,关键字:
(c)nonlocal
(d)global

locals 和 globals

locals: 打印当前可用的变量的字典
    globals: 返回一个描述当前全局变量的字典

提示:locals 是获取当前的可用变量,而 globals 是获取全局的变量

在使用 locals() 和 globals() 会出现以下三种表现形式:

(1)当locals 和 globals 都在全局作用域的时候,获取的可用环境变量是一致的

print(globals() == locals())
print(locals())
print(globals()) # 执行结果:
# True
# {'__cached__': None, '__doc__': None, ......}
# {'__cached__': None, '__doc__': None, ......}

分析:
    locals 和 globals 都在全局作用域中时,二者获取到的变量是一致的。

(2)当 locals 在局部作用域中,而 globals 在全局作用域中

def func():
name = 'jay'
print(locals()) func()
print(globals())
print('name' in globals()) # 执行结果:
# {'name': 'jay'}
# {'__file__': 'E:/learn_python/day15-1/test4.py', '__name__': '__main__', 'func': <function func at 0x0000019865D57268>}
# False

分析:
    当 locals 在局部作用域中,而 globals 在全局作用域中时:
        locals 获取的仅仅是当前局部作用域中的变量,例如:{'name': 'jay'};
        globals 依然是获取全局变量;
        全局变量无法获取局部作用域中的变量,反之亦然,二者是相互独立的,但是全局变量可以获取在全局定义的函数、类、变量等;

(3)locals 和 globals 都在局部作用域中

def func():
name = 'jay'
age = 20
print(locals())
print(globals())
print('name' in globals()) func() # 执行结果:
# {'age': 20, 'name': 'jay'}
# {'func': <function func at 0x0000024665227268>, '__name__': '__main__'......}
# False

分析:
    locals 和 globals 都在局部作用域中
        locals 获取的仅仅是当前局部作用域中的变量,例如:{'name': 'jay'};
        globals 依然是获取全局变量;
        全局变量无法获取局部作用域中的变量,反之亦然,二者是相互独立的,但是全局变量可以获取在全局定义的函数、类、变量等;

总结:

locals 和 globals 内置函数
    
    locals 是获取当前环境可用的变量,如果 locals 在全局作用域中调用,获取的就是全局作用域中的变量,如果在局部作用域中调用,获取的就是局部作用域中的变量
    globals 是获取全局环境中可用的变量,无论 globals是在全局中还是在局部中调用,获取到的一定是全局作用域中的变量,且 globals 和 locals 是相互独立的存在

接下来,在分析下 nonlocal 和 global 的使用

要记住在 python 中引用变量的顺序:
    当前作用域局部变量 --> 外层作用域变量 --> 当前模块中的全局变量 --> python内置变量

global 的使用

global关键字用来在函数或者其他局部作用域中使用全局变量,但是如果不修改全局变量是可以不实用global关键字

(1)仅仅只是查看使用全局变量,不做任何修改

name = 'hkey'

def func():
print('局部变量 name:', name) # 根据pyton引用变量的顺序,在全局作用域中找到了 name 变量 func()
print('全局变量 name:', name) # 执行结果:
# 局部变量 name: hkey
# 全局变量 name: hkey

(2)获取全局变量,并修改全局变量

name = 'hkey'

def func():
global name # 通过 global 关键字获取全局变量 name
name = 'jay' # 因为上面有 global 获取换全局变量 name 所有这里对全局变量 name 进行操作 func()
print('name:', name) # 执行结果:
# name: jay

(3)全局变量和局部变量同名的表现形式

name = 'hkey'

def func():
name = 'jay' # 在局部作用域中直接定义了 name 变量,因此在局部获取 name 变量的时候,根据引用顺序,直接就从局部获取
print('局部变量 name: ', name) func()
print('全局变量 name:', name) # 全局变量未更改 # 执行结果:
# 局部变量 name: jay
# 全局变量 name: hkey

global 总结:
    global 是用来在局部作用域中引用python全局变量的
        a. 当局部仅仅只是查看使用,可直接调用全局中的变量
        b. 当局部需要修改全局变量,则需要使用 global 来获取全局变量
        c. 定义局部变量的时候,应该尽量变量和全局变量重名

nonlocal 的使用

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量,nonlocal是无法获取全局变量的

(1)仅仅只是查看使用外层(非全局)变量,不做任何修改

def func():
name = 'hkey'
def foo():
print('函数foo 局部变量 name:', name) # 根据 python 引用变量的原则,不修改变量时可以直接获取
return foo f = func()
f() # 执行结果:
# 函数foo 局部变量 name: hkey

(2)获取外层(非全局)变量,并修改外层(非全局)变量

def func():
name = 'hkey'
def foo():
nonlocal name # 使用 nonlocal 关键字,获取外层(非全局)变量
name = 'jay' # 修改外层(非全局)变量
print('函数foo 局部变量 name:', name)
return foo f = func()
f() # 执行结果:
# 函数foo 局部变量 name: jay

nonlocal 总结:
    仅仅只能获取外层(非全局)变量,获取全局变量会报错

总结

globals() 和 locals():
    (1)二者都是 python 内置函数
    (2)globals 无论在全局还是局部都是用来获取全局变量的,而 locals 会随着作用域的不同获取不同作用域的变量

global 和 nonlocal 是 python 内部关键字,
    global 是用来在局部作用域获取全局变量的
    nonlocal 是用来在局部获取外层(非全局)变量,二者是不同的。

[ python ] 全局和局部作用域变量的引用的更多相关文章

  1. javascript - 全局与局部作用域

    // 全局作用域 var globalNumber = 1; // 挂载在window上的变量或函数 -> 全局作用域 function InternalScope() { // 局部作用域 / ...

  2. vue-learning:13 - js - vue作用域概念:全局和局部

    目录 全局作用域:Vue对象 全局api 局部作用域: 实例对象vm 实例api 组件component 组件配置选项 在引入Vue文件时,就相当于拥有了一个全局Vue对象. 在var vm = ne ...

  3. Python的命名空间及作用域

    命名空间的分类 全局命名空间 是在程序从上到下被执行的过程中依次加载进内存的:放置了我们设置的所有变量名和函数名 局部命令空间 就是函数内部定义的名字:当调用函数的时候 才会产生这个名称空间 随着函数 ...

  4. Python中命名空间与作用域使用总结

    1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...

  5. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  6. js 函数 作用域 全局作用域 局部作用域 闭包

    一个变量没有声明但调用 直接报错,声明没有赋值会显示未定义. 作用域 作用域(scope):一条数据可以在哪个范围中使用. 通常来说,一段程序代码中所用到的数据并不总是有效/可用的,而限定这个数据的可 ...

  7. Python 3 学习笔记之——变量作用域、模块和包

    1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...

  8. C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...

  9. C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系

    C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...

随机推荐

  1. 深入理解JVM一JVM内存模型

    前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 一.运行流程 我 ...

  2. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  3. 【纪念】NOIP2018前夕——一些想说的话

    刚刚复习了一下相关的内容,决定一会儿就洗洗睡了.在睡觉之前,决定写点东西. 有的时候真的很迷茫,选择了一条超过自己能力范围的路,每天挣扎在各种各样难题的面前,文化成绩一落千丈……在从前觉得这一切都是有 ...

  4. ueditor上传图片配置

    1 去ueditor文件夹下 找 ueidtors/dialogs/image/image.html -- 配置位置大概如下: 107   utils.domReady(function(){ 108 ...

  5. C++——内存对象 禁止产生堆对象 禁止产生栈对象

    用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内 ...

  6. git push要输入密码问题

    git push突然每次都要输入密码了,这个问题困扰了两天,要无密码push,要保证两点. 1.  git clone的url一定得是git开头的,不能是https开头的,这个容易被忽略,github ...

  7. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  8. CF1100E

    i207M给的题 省选前-小题解合集 给定一张有向图,每条边有边权.你可以花费边权的代价反转一条边,使得原图中没有环.最小化反转的边权的最大值. 首先二分,然后考虑判定. 转化为有些边可以翻转,有些边 ...

  9. [ZJOI2015]幻想乡战略游戏——动态点分治

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...

  10. 图片虚拟目录--即图片保存在window硬盘上面

    这个是图片保存在电脑的硬盘上面的图片上传设置,既不是在web工程中,也不是在专门的图片服务器中,下面是配置方法: r 这里的Document base 我们这里设置为F:\images 如果在浏览器访 ...