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

命名空间查找顺序: 假设我们要使用变量 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 -
最后修改:2023年10月16日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.ink0.cn/index.php/2023/02/23/10-%e4%b8%89%e7%a7%8d%e4%bd%9c%e7%94%a8%e5%9f%9f/
共有 0 条评论