10-三种作用域

AffettoIris 2023-2-23 2,979 2/23

三种命名空间

内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

10-三种作用域

命名空间查找顺序: 假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间。如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:

NameError: name 'runoob' is not defined。

所以对于第5行i_count,是先找4/5行作用域,再去2行作用域找,再去1行作用域找,最后去内置名称所在的命名空间找。

1 g_count = 0  # 全局作用域
2 def outer():
3     o_count = 1  # 闭包函数外的函数中
4     def inner():
5        i_count = 2  # 局部作用域

内部作用域想修改外部作用域的变量

golbal关键字

num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num) # 1
    num = 123
    print(num) # 123
fun1()
print(num) # 123

外部作用域想修改内部作用域的变量.

没必要

内部嵌套作用域想修改内部作用域的变量

需要 nonlocal 关键字

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num) # 100
    inner()
    print(num)  # 100
outer()

注意,从变量的搜索顺序可见,只读变量,不论有没有nonlocal global,要修改变量,得nonlocal global

def a():
    num=10
    def b():
        print(num)
    b()

a() # 10

def a():
    num=10
    def b():
        nonlocal num
        num = 11
    print(num)
    b()

a() # 10
- THE END -

AffettoIris

10月16日15:58

最后修改:2023年10月16日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论