目录
一、命名空间
1.定义
Python的命名空间的本质是一个字典,用来记录变量名称和值。
字典的key是变量的名称,字典的value对于的是变量的值。例如 {‘name’:’zs’,’age’:10}
命名空间一共分为三种:
(1)局部命名空间
每个函数都有自己的命名空间,叫做局部空间
记录的是参数以及在函数体中声明的变量
def func():
a=19
b=20
print('azy')
(2) 全局命名空间
每个模块(整个py文件)拥有它自已的命名空间,叫做全局命名空间
记录的是整个py文件中的变量、函数、类
def func():
a=19
b=20
print('azy')
print(func)
(3)内置命名空间
记录的是内置函数,任何模块均可访问它
print(print)
print(id)
print(type)
2.访问
(1)局部名称空间访问
使用 locals() 函数
(2)全局命名空间的访问
使用globals()函数
3.加载顺序
内置命名空间(程序运行前加载)->
全局命名空间(程序运行中:从上到下加载)->
局部命名空间(程序运行中:调用时才加载)
4.查找顺序
(1)第一种情况
思路:
'''
先从局部命名空间中查找,
if 能找到:
返回局部命名空间中的值
else:
再从全局命名空间中查找
if 能找到:
返回全局命名空间中的值
else:
再从内置命名空间中查找
if 能找到:
返回内置命名空间中的值
else:
报错
'''
实现:
(2)第二种情况
思路:
如果一开始就从全局命名空间中查找,就直接找全局命名空间中的内容,
如果找到则停止搜索,如果找不到,就向内置命名空间中查找,如果查找到就给返回内容,查不到就报错。
实现:
(3)第三种情况
思路:
自己的变量名不要和内置函数的变量名相同,否则不能使用内置命名空间中的函数功能
实现:
二、作用域
1.定义
作用域指的是变量在程序中的可应用范围
2.分类
作用域按照变量的定义位置可以划分为4类即LEGB:
(1)Local
局部作用域(函数内部)---->函数体中声明的变量
(2)Enclosing
嵌套作用域(闭包)(嵌套函数的外层函数内部)----->嵌套函数中外层函数体中声明的变量
(3)Global
全局作用域(模块全局)---->py文件中声明的变量
(4)Built-in
内置作用域(内建)---->Python提供的变量(函数)
3.搜索
Python搜索4个作用域:
[本地作用域(L)---->上一层结构中def或者lambda的本地作用域(E)---->全局作用域(G)---->内置作用域(B)(即python的内置类和函数等)]
在第一处能够找到这个变量名的地方停下来
如果变量名在整个的搜索过程中都没有找到,Python就会报错
(1)第一次
(2)第二次
(3)第三次
(4)第四次
三、局部变量与全局变量
1.定义
在函数中定义的变量称为局部变量,只在函数内部生效;
在程序一开始定义的变量称为全局变量,全局变量的作用域是整个程序。
2.实现
(1)局部变量和全局变量
(2)全局变量的两种情况
全局变量是不可变数据类型,函数无法修改全局变量的值
name = 'zs'
def func():
name = 'ls'
print(name)
func()
print(name)
全局变量是可变数据类型,函数可以修改全局变量的值
直接修改
a = 10
lst = [1, 2, 3]
def func():
a = 30
print(a)
lst.append(4)
func()
print(a)
print(lst)
间接修改
a = 10
lst = [12, 3]
def func(c, lst1):
c = 20
lst1.append(4)
print(c, lst1)
func(a, lst)
print(a, lst)
四、global和nonlocal关键字
1.global关键字
可以将局部变量变成一个全局变量
格式: global 变量名称
(1)使用前
age=16
def nj():
age=20
print(age)
nj()
print(age)
print('*'*30)
(2)使用后
修改全局变量
age=16
def nj():
global age
age=20
print(age)
nj()
print(age)
print('*'*30)
2. nonlocal关键字
可以修改外层(非全局)变量
格式:nonlocal 变量名称
(1)使用前
age=16
def nj():
age=18
def nj2():
age=20
print(age)
nj2()
print(age)
nj()
print(age)
print('*'*30)
(2)使用后
age=16
def nj():
age=18
def nj2():
nonlocal age
age=20
print(age)
nj2()
print(age)
nj()
print(age)