[ python ] 全局和局部作用域变量的引用

全局与局部变量的引用

(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 是用来在局部获取外层(非全局)变量,二者是不同的。

原文地址:https://www.cnblogs.com/hukey/p/9726142.html

时间: 2024-08-02 11:02:27

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

哪个变量可以引用全局作用域中可用的全部变量

w http://php.net/manual/en/language.variables.superglobals.php http://php.net/manual/zh/language.variables.superglobals.php http://php.net/manual/zh/reserved.variables.globals.php http://php.net/manual/en/reserved.variables.globals.php Superglobals S

比较全局变量、全局静态变量、局部变量、局部静态变量的区别

比较全局变量.全局静态变量.局部变量.局部静态变量的区别,他们在编译完后存储位置在什么地方.初始化值在什么地方.内存什么时候分配.赋初值对这些变量有哪些影响等.要弄清楚这些问题,首先要弄清楚下面几个知识点. C语言分下面几个存储区: 1.栈区(stack) 由编译器在需要的时候自动分配释放,在不需要的时候就自动清除的变量存储区.通常存放的变量是函数的参数值.局部变量的值等,其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员去分配释放,和编译器完全没有关系,直接由我们的应用程序去

PHP引用操作以及外部操作函数的局部静态变量的方法

通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引用符才能保持地址操作 3. 函数返回值引用必须在函数申明时以及调用时都添加引用操作符 该例子使用的是对象方法的操作,同样适用于函数 <?php class A { public function & test1(& $a) { static $i = 0; var_dump($i); $

PHP 的 返回引用(方法名前加&) 和 局部静态变量(static)

先阅读手册==========从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & : 例子 17-13. 由函数返回一个引用 <?php   function &returns_reference()   {       $someref = 0;       return $someref;   }      $newref = &returns_reference();//相当于 $newref = &$someref;   ?>

Python——变量的引用和函数的参数和返回值的传递方式

变量的引用 在python中,所有的变量都是指向地址,变量本身不保存数据,而是保存数据在内存中的地址.我们用下面的程序来理解: 1 a = 10 2 print(id(a)) 3 a = 11 4 print(id(a)) (利用id( )方法查看数据的地址) 输出结果为: 可以发现:修改变量的值,变量保存的地址随之改变. python中: 变量和数据是分开存储的 变量 中保存着数据在内存中的地址 我们把变量中记录数据的地址的行为,叫做 引用. 通俗的来说,在 Python 中,变量的名字类似于

3.关于python函数,以及作用域,递归等知识点

一.使用函数编程的好处. 大大的提高了代码的重用行,重复的逻辑或者操作,可以定义到一个函数里,多次调用. 下面是关于提高代码重用性的例子. 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码. while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 i

Python的程序结构[3] -&gt; 变量/Variable -&gt; LEGB 法则

LEGB法则 / LEGB Rule LEGB 变量搜索顺序 ---- 来源于<Python学习手册>/ Learning Python Page 419 ---- Python 的变量名解析机制称为  LEGB 法则. L – Local: 本地作用域; E – Enclosing: 上一层结构中 def 或 lambda 的本地作用域; G – Global: 全局作用域; B – Build-in: 内置作用域. LEGB作用域查找原则:当引用一个变量时,Python 按以下顺序依次进行

python——函数嵌套和作用域

1.三元运算if条件成立的结果 if 条件 else 条件不成立的结果例如: a=20 b=10 c=a if a>b else b print(c) 2.命名空间 全局命名空间:创建的存储"变量名与值的关系"的空间叫做全局命名空间 局部命名空间:在函数的运行中开辟的临时的空间叫做局部命名空间 内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...等等 三种命名空间之间的加载顺序和取值顺序:加载顺序:内置(

使用C语言为python编写动态模块(1)--从底层深度解析python中的对象以及变量

楔子 我们知道可以通过使用C语言编写动态链接库的方式来给python加速,但是方式是通过ctypes来加载,通过类CDLL将动态链接库加载进来得到一个对象之后,通过这个对象来调用动态链接库里面的函数.那么问题来了,我们可不可以使用C语言为python编写模块呢?然后在使用的时候不使用ctypes加载动态库的方式,而是通过python的关键字import进行加载. 答案是可以的,我们知道可以通过编写py文件的方式来得到一个模块,那么也可以使用C语言来编写C源文件,然后再通过python解释器进行编