首页 > 其他 > 详细

函数的名称空间和作用域

时间:2019-11-11 17:52:25      阅读:74      评论:0      收藏:0      [点我收藏+]

函数的名称空间和作用域

一、名称空间

1.什么是名称空间

名称空间就是存放名字(变量名或者函数名等)与对象映射/绑定关系的地方。例如x = 3,python会将内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间,del x 表示清除该绑定关系。

如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系

2.名称空间的分类

  • 内置名称空间

    python提前定义过的名字,比如内置的函数名,就是存在于内置名称空间,

    生命周期:python解释器启动的时候生效,解释器关闭的时候失效

  • 全局名称空间

    py文件执行过程中产生的名字都会存放于全局名称空间,是第二个被加载的名称空间,例如if,while,for内部定义的名字执行之后也会存放于全局名称空间。

    生命周期:当启动当前py文件时全局名称生效,当前页面代码执行结束就会失效。

    例如:以下名称都是全局名称空间
    import sys  #模块名sys
    ?
    x=1  #变量名x
    ?
    if x == 1:
       y=2  #变量名y
    ?
    def foo(x):  #函数名foo
       y=1
       def bar():
           pass
    ?
    Class Bar:  #类名Bar
       pass    

     

  • 局部名称空间

    函数内部定义的所有的名字都是存放于当前函数的局部名称空间

    生命周期:当你调用函数时生效,函数体最后一行代码执行结束时失效

    def foo(x):
       y=3    #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中
  • 名称空间的加载顺序

    内置名称空间--->全局名称空间--->局部名称空间

  • 查找顺序

    局部名称空间--->全局名称空间--->内置名称空间

    在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

    在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

二、作用域

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

  1. 全局作用域:位于全局名称空间、内置名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);

  2. 局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。

只有可变类型可以在局部修改外部变量的值

注意:可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()

  • global:可以声明全局变量(将局部变量改为全局变量)

在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字 , 当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,

nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量, 例如nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

函数的名称空间和作用域

原文:https://www.cnblogs.com/jiangxianseng/p/11837011.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!