python-17-命名空间和作用域

前言

命名空间:既是我们平时在写python中写的代码变量/函数/类等命名,有时候你发现命名不能重复或者出现冲突这些都关系着命名空间。

作用域:可以直接访问命名空间的正文区域,从内到外依次访问所有的作用域直到找到,找不到咋办?报错呗,说白了就是这个命名我去哪里找到你呢。

一。命名空间

python 中避免命名冲突的一种方法,各个独立,没有任何关系,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

命名空间有三种:

1.内置命名空间:
  ①就是python解释器一启动就可以使用的名字存储在内置命名空间中
  ②内置的名字在启动解释器的时候被加载进内存里
  ③在内置:不能使用局部和全局的名字的

2.全局命名空间:
  ①是在程序从上到下被执行的过程中依次加载进内存的
  ②放置了我们设置的所有变量名和函数名
  ③在全局:可以使用内置命名空间中的名字,但是不能用局部中使用

3.局部命名空间:
  ①函数内部定义的名字
  ②当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
  ③在局部:可以使用全局、内置命名空间中的名字

下面搞两个例子:

1.先找内部命名空间:

# 在全局定义和内置命名同名时,会使用全局的名字
# 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。
def input():
    print('你瞎搞!!!')

def func(input):
    input()         # 我调用函数 input
    input = 22      # 打印 input 就是先找到我
    print(input)

func(input)

2.内部没有就找全局的:

# 在全局定义和内置命名同名时,会使用全局的名字
# 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。

def input():
    print('你瞎搞!!!')

def func():
    return input

func()()

 二。作用域

作用域两种:
1.全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()——只打印全局的名字

2.局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()——只打印局部的名字

nonlocal:只能用于局部变量(对全局无效),声明一个上层,最近的函数局部变量能进行所有操作。

# 不可变数据类型 在局部可查看全局作用域中的变量,但是不能直接修改。
# 如果要修改,需在程序的开始声明:global
# 在局部(函数)内声明了global 变量,则在局部中的变量所有操作将对对全局有效。

a = 0
def func():
    global a                       # 声明:global a,即可以操作,未声明会报错
    a += 10
    b = 222
    print('局部作用域:', locals())   # 查看局部空间作用域
    print('全局作用域:', globals())  # 查看全局空间作用域

print('声明前:', a)                 # 未调用声明函数前
func()
print('声明后', a)                  # 调用声明的函数后

欢迎来QQ交流群一起学习:482713805

原文地址:https://www.cnblogs.com/gsxl/p/12385980.html