名称空间与作用域

一、定义

  用于存放变量名与变量值绑定关系的地方

二、名称空间的分类

  1、内置名称空间

    python解释器提前定义好的。如print()、len()

  2、全局名称空间

    在py文件中顶格编写的代码运行之后都会存入全局名称空间

复制代码
name = 'jason'  # name全局


def func():  # func全局
    pass


if 1:
    a = 123  # a全局

for i in range(10):
    print(i)  # i全局

print(i)
复制代码

  3、局部名称空间

    函数代码体运行之后产生的都是局部名称空间

  4、存活周期

    4.1、内置名称空间

        python解释器启动与关闭而创建和销毁

    4.2、全局名称空间

        随着py文件的运行与结束而创建和销毁

    4.3、局部名称空间

        随着函数代码体的执行与结束而创建和销毁

三、名字的查找顺序

  1、在查找名字的时候,要先确认自己当前在哪

    1、如果你在局部,查找的顺序就是

        局部 >>> 全局 >>> 内置

    2、如果你在全局,查找顺序是

        全局 >>> 内置

  2、局部名称空间的嵌套

复制代码
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)  # 结果为555

            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()
复制代码

 四、名称空间的作用域

    作用域:名称空间所能够作用的范围

    内置名称空间:程序任何阶段任何位置均可使用(全局有效)

    全局名称空间:程序任何阶段任何位置均可使用(全局有效)

    局部名称空间:一般情况下只在各自的局部名称空间中有效

五、global与nonlocal关键字使用

    1、global使用

      局部修改全局数据:如果数据为不可变类型则需要关键字global声明;如果数据为可变类型则无需要关键字global声明。

复制代码
x = 111
def index():
    # 局部修改全局变量 需要使用关键字声明
    global x
    x = 222
index()
print(x)


name_list = ['jason', 'kevin']
def index():
    name_list.append('heiheihei')
index()
print(name_list)
复制代码

    2、nonlocal使用

      如果想要在内部的局部修改外部局部的不可变数据类型,需要关键字nonlocal声明。

复制代码
def index():
    x = 111
    def func():
        # 内部局部修改外部局部
        nonlocal x
        x = 222
    func()
    print(x)
index()
复制代码

 

posted @   那就凑个整吧  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示