python 之名称空间与作用域
发布日期:2021-05-04 19:07:10 浏览次数:14 分类:精选文章

本文共 1537 字,大约阅读时间需要 5 分钟。

Python 之 名称空间与作用域

栈区与堆区的关系

在Python中,变量名与内存地址的映射关系存储在栈区中,而实际值的存储位置则位于堆区。栈区用于记录变量名到内存地址的映射关系,堆区则存储变量的实际值。

一、名称空间

起步

名称空间是什么?

名称空间是存储变量名与对象绑定关系的地方。简单来说,名称空间相当于一个大字典,记录了变量名对应的内存地址。名称空间是虚拟概念,实际存储在栈区中。

核心概念

名称空间是否具有包含关系?

名称空间之间本质上是没有包含关系的。每个名称空间都是独立的,互不干扰。
例如,内置名称空间、全局名称空间和局部名称空间各自独立。

为什么需要名称空间?

名称空间的主要作用是允许多个变量名共存,不互相干扰。通过名称空间,Python可以在不同作用域中使用相同的变量名,而不导致命名冲突。

查找顺序

在查找变量时,Python遵循以下优先级:

  • 局部名称空间
  • 全局名称空间
  • 内置名称空间
  • 三种名称空间的个数规定:

    • 内置名称空间和全局名称空间各只有一个。
    • 局部名称空间可以有多个。

    二、名称空间的分类

    1. 内置名称空间

    内置名称空间存储了Python解释器内置的函数和变量。

    例如:
    len 是内置函数,print 也是内置函数。
    内置名称空间的存活周期与解释器一致,解释器关闭则销毁。

    2. 全局名称空间

    全局名称空间存储了文件级别的变量。

    例如:
    x = 1 定义在全局名称空间中。
    全局名称空间的存活周期与文件执行期间一致。

    3. 局部名称空间

    局部名称空间存储了函数内部定义的变量。

    例如:
    def func():
    x = 222
    func()
    在调用函数时,局部名称空间临时生效,函数调用结束后则失效。

    三、名称空间的关系

    名称空间的加载顺序是:

  • 内置名称空间
  • 全局名称空间
  • 局部名称空间
  • 名称空间的销毁顺序是:

  • 局部名称空间
  • 全局名称空间
  • 内置名称空间
  • 名称空间的查找优先级是:

    在当前作用域内,先检查局部名称空间,再依次向上查找全局名称空间和内置名称空间。

    四、作用域

    全局作用域

    全局作用域包含全局名称空间和内置名称空间。全局变量的生效范围是整个程序生命周期。

    局部作用域

    局部作用域包含局部名称空间。局部变量的生效范围仅限于函数调用期间。

    全局与局部的互动

    局部作用域可以引用全局作用域的变量,但无法修改其值。例如:

    x = 10
    def func():
    print(x)
    func()

    输出结果会是 10,因为局部作用域无法修改全局变量。

    五、global与nonlocal关键字

    global关键字

    global 关键字用于声明一个变量属于全局作用域。它只能用于局部名称空间中,且只能用于不可变类型的变量。

    使用场景:

    x = 1
    def func():
    global x
    x = 2
    func()

    全局变量会被修改。

    nonlocal关键字

    nonlocal 关键字用于在函数嵌套中修改外层函数的局部变量。它只能用于局部名称空间中的函数嵌套。

    使用场景:

    x = 111
    def f1():
    x = 222
    def f2():
    nonlocal x
    x = 333
    f2()

    f2() 调用会修改 f1() 中的 x。

    注意事项

    • nonlocal 关键字只能在函数嵌套中使用,第一层函数无法使用。
    • 语句中列出的名称不得与局部作用域中的变量名冲突。

    总结与实战技巧

    • 三个名称空间的查找顺序是 LEGB(Local > Enclosed > Global > Built-in)。
    • 全局变量与局部变量的互动需要正确使用 globalnonlocal 关键字。
    • 在处理可变类型时,应避免直接修改全局变量,使用内置方法进行操作。
    上一篇:python入门之基本运算符
    下一篇:python文件处理之编码字符

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年03月27日 07时26分47秒