首页 > 其他分享 >名称空间与作用域

名称空间与作用域

时间:2023-02-28 19:11:58浏览次数:36  
标签:index 函数 作用域 名称 func 空间 全局 def

一、名称空间的概念

名称空间(namespace)就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)

二、分类

在程序执行期间最多会存在三种名称空间

2.1 内建名称空间

伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,eg:
len print input

2.2 全局名称空间

伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中,其中,在py文件中,顶格写的代码都在全局名称空间中, 如下

name = 'kevin'  # 变量名name

if  True:
    a = 1  # 变量名a

while True:
    x = 10  # 变量名x

 def index():  # 函数名index
        pass

2.3 局部名称空间

伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中

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

2.4 查看

可以调用内建函数globals()和locals()来分别查看全局名称空间和局部名称空间的名字,返回的结果都是字典格式。使用locals()查看时,要在局部查看。

三、名字的查找顺序

第一步、首先先确定你所在的位置
第二步、如果在局部中:局部 >>> 全局 >>> 内置
第三步、如果在全局中:全局 >>> 内置

# 局部
x=100
def func():
    x=300
    print(x)
func()  # 结果是300


# 全局
x=100
def func():
    x=300
func()  
print(x)  # 结果是100

Python支持函数的嵌套定义,在内嵌的函数内查找名字时,会优先查找自己局部作用域的名字,然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域

"""
函数体代码中名字的查找顺序在函数定义阶段就已经固定死了
"""

# x = 888
def index():
    # x = 666

    def index1():
        # x = 555

        def index2():
            # x = 444

            def index3():
                # x = 333

                def index4():
                    x = 222
                    print(x)
                index4()

            index3()

        index2()

    index1()


index()

四、名称空间的作用域

作用域就是作用的范围

  1. 内置的
    在任何阶段任何时间都可以使用 (全局有效)
  2. 全局的
    在任何阶段任何时间都可以使用 (全局有效)
  3. 局部的
    在函数内部阶段使用 (局部有效)

五、global与nonlocal关键字的使用

5.1 global

局部修改全局的

  1. 修改的是不可变类型,必须使用global关键字声明一下
  2. 修改的是可变类型,就可以直接修改

1.当全局作用域中的值为不可变类型时
在函数内,无论嵌套多少层,都可以查看到全局作用域的名字

# 局部空间中重新赋值也不会改变全局中x的值,x仍然是100
x = 100
def index():
    x = 200
index()
print(x)  # x的结果是100

想要在函数内修改全局名称空间中名字的值,需要用到global关键字

x = 100
def index():
    # 局部修改全局的变量
    global x  # 声明变量x为全局的x
    x = 200
index()
print(x)  # x的结果是200

2.当实参的值为不可变类型时,函数体对该值的修改将会直接反应到原值

x = ['kevin', 'jack']
def index():
    # 局部修改全局的变量
    x.append('tony')
index()
print(x)
# 输出结果是:['kevin', 'jack','tony']

5.2 nonlocal

内部的局部修改外部的局部

  1. 如果是不可变类型,必须使用nonlocal关键字声明一下
  2. 如果是可变类型,就可以直接改变

1.不可变类型

# 对于嵌套多层的函数中,
# 不可变类型时,嵌套内部的赋值改变不了外部的值,x的值是60
def index():
    x = 60
    def func():
        x = 90
    func()
    print(x)
index()  # x的结果是60

# 想要内部的局部修改外部的局部,需要使用nonlocal关键字
def index():
    x = 100
    def func():
        nonlocal x
        x = 200
    func()  # 调用func(),修改index()作用域中名字x的值
    print(x)  # 在index()作用域查看x
index()  # x的结果是90
# nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

2.可变类型

# 可变类型
def index():
    x = ['a', 'b']
    def func():
        x.append('c')
    func()
    print(x)  # ['a', 'b', 'c']
index()

标签:index,函数,作用域,名称,func,空间,全局,def
From: https://www.cnblogs.com/zjyao/p/17165626.html

相关文章

  • 解决SQL Server 删除大量数据后磁盘空间无变化
    造成空间不变化的原因InnoDB中采用了B+树作为存储数据的结构,也就是常说的索引组织表。在InnoDB中,delete操作并不会真的删除数据,SQLServer实际上只是给要删除的数据打......
  • 单个表空间文件个数达到上限 ORA-01686
    #问题概述因在oracle数据库表空间管理中的时候报ORA-01686:max#files(1023)reachedforthetablespaceGPRSSQL>altertablespaceGPRSadddatafile'+DATADG'......
  • linux 网络命名空间
    #创建网络命名空间ipnetnsaddnetns1#查看新增的网络命名空间ipnetnslist#查看挂载点ls/var/run/netns/#进入网络命名空间查看ipnetnsexecnetns1ip......
  • js作用域、作用域链和它的一些优化
    前言作用域和作用域链是所有JavaScript开发人员每天都要接触和应用的内容。不管是面试中的作用域链的面试考察,还是日常代码研发中变量与作用域链的构建,它的身影几乎无处不......
  • 怎么把控件贴到三维空间里的一个面上
    今天有人在问:怎么把控件贴到三维空间里的一个面上?我想,可以看看这篇文章:使用WPF向控件和三维表面添加视频(​​http://msdn.microsoft.com/zh-cn/mag......
  • KingbaseES V8R6 备份恢复案例 -- 自定义表空间指定目录恢复
    ​案例说明:KingbaseESV8R6在通过sys_rman执行物理备份恢复时,可以通过参数‘--kb1-path’,指定恢复的数据(data)目录,但如果原备份中包含自定义表空间时,需要建立表空间映射,再......
  • 5.4 空间直线及其方程
    本节课的大致内容空间直线的一般方程两个平面方程联立可以得到这个两个平面相交直线的方程当不是一个固定的值的时候,这样联立就会得到一个新的平面的方程,该方程就是过......
  • 查看linux空间使用-摘抄
    1.1查看各个目录使用情况df-h,可以看到根目录["/"]占用较大,进入根目录进一步查看2.查看当前目录磁盘空间使用情况包含各个目录,及总使用量du-h.  2.2对当......
  • TypeScript 命名空间
    TypeScript命名空间命名空间一个最明确的目的就是解决重名问题。假设这样一种情况,当一个班上有两个名叫小明的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些......
  • 本地虚拟机centos7空间扩展10G记录
    因为要安装oracle11g的docker版本,空间不够,所以增加10G空间进入linux系统df-h发现跟原来一样没有增加,需要进行操作按下面操作,主要是fdisk/dev/sda[root@localhost~]#fdis......