跳到主要内容位置

名称空间和作用域

名称空间#

全局名称空间:py文件中存放变量与值的关系的一个空间

局部名称空间:当执行一个函数时,内存中会临时开辟一个空间,临时存放函数中的变量与值的关系

内置名称空间:内置名称空间存放的就是一些内置函数等拿来即用的特殊的变量:input,print,list等等

加载顺序#

内置命名空间(程序运行伊始加载)=>全局命名空间(程序运行中:从上到下加载)=>局部命名空间(程序运行中:调用时才加载。

取值顺序#

空间的取值顺序与加载顺序是相反的,取值顺序满足的就近原则,从小范围到大范围一层一层的逐步引用。

image-20210410084550571

如果你在全局名称空间引用一个变量,先从全局名称空间引用,全局名称空间如果没有,才会向内置名称空间引用

如果你在局部名称空间引用一个变量,先从局部名称空间引用,局部名称空间如果没有,才会向全局名称空间引用

全局名称空间再没有,就会向内置名称空间引用。

在函数中,可以引用全局名称空间的变量,但不可以对这个变量进行修改

在函数中,如果你定义了一个变量,但是在定义这个变量之前就对其引用了,那么解释器就会认为是:语法问题,你应该在引用前先去定义

count = 1
def func():
print(count)
"""
因为在局部,所以局部名称空间没有,才会向全局名称空间引用
找局部的时候发现局部空间有定义了,但是是在引用之后定义的,所以就会报错
"""
count = 3
func()

global#

在局部作用域声明一个全局变量

声明后可在局部修改全局变量

count = 1
def func():
global count
count += 1
print(count) # 1
func()
print(count) # 2

nonlocal#

局部作用域:内层函数对外层函数的局部变量进行修改。

def wrapper():
count = 1
def inner():
nonlocal count
count += 1
print(count) # 1
inner()
print(count) # 2
wrapper()

作用域#

  • 全局作用域: 包含内置名称空间和全局名称空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐⾏执行)

  • 局部作用域: 在函数内部可以使用

作用域名称空间#

  1. 全局作用域: 全局名称空间 + 内置名称空间
  2. 局部作用域: 局部命名空间

内置函数 locals和globals#

这两个内置函数直接可以反映作用域的内容,有助于我们理解作用域的范围。

locals(): 以字典的形式返回当前作用域的变量的对应关系。

globals(): 以字典的形式返回全局作用域所有的变量对应关系。