python基础之名称空间

python基础之名称空间

名称空间

1.名称空间分类


# 引入概念的例子
name = 'jason'
1 在内存空间内申请一块地方 存放'jason'
2 将'jason'绑定一个变量名name
3 后续通过变量名name就可以访问到'jason'所在的内存地址
del name表示清除该绑定关系

名称空间:用来存储变量名与数据值绑定关系的地方(我们也可以简单理解为就是存储变量名的地方)del name
变量名(name)则是存放在名称空间

1.内置名称空间 # py解释器中的名字

	解释器运行自动产生,里面包含了很多名字
	系统自带的空间,已经提前准备好了很多关键字和变量名
  	#如: len print
<built-in function len> #built-in内建

2.全局名称空间 # 运行py文件产生的空间
	py文件运行产生,里面存放文件级别的名字()
  	模块名、变量名、函数名、类名
    
 # 如 
import sys #模块名sys
 
x=1 #变量名x
 
if x == 1:
    y=2 #变量名y
 
def foo(x): #函数名foo
    y=1
    def bar():
        pass
 
Class Bar: #类名Bar
	pass    
  
3.局部名称空间 # 运行函数时产生的空间
	函数体代码运行、类体代码 产生的空间 

2.名称空间存活周期及作用范围(域)

名称空间的加载顺序是:
 	内置名称空间->全局名称空间->局部名称空间

1.存活周期
    内置名称空间
  	python解释器启动则创建,关闭则销毁
    全局名称空间
    	py文件执行则创建,运行结束则销毁
    局部名称空间
    	函数体代码、(类体代码)运行则创建,函数体代码结束则销毁
 2.作用域
    内置名称空间
  	解释器级别的全局有效
    全局名称空间
    	py文件级别的全局有效
    局部名称空间
    	函数体代码内有效

3.名字的查找顺序

# 大前提: 涉及到名字的查找,一定要搞明白自己在哪个空间
查找顺序:
    局部名称空间->全局名称空间->内置名称空间	
  
-> 先在各个空间查找这个名字
  1当我们在局部名称空间中的时候
    局部名称空间>>> 全局名称空间>>> 内置名称空间
  2当我们在全局名称空间中的时候
    全局名称空间>>> 内置名称空间

# 其实名字的查找顺序是可以打破的    
image-20221010184030445
  • 查找顺序的案例
1.相互独立的的局部名称空间默认不能相互访问
def func1():
    name = 'jason'
    print(age)
    
def func2():
    age = 12
    print(name)    

相互独立的的局部名称空间默认不能相互访问

image-20221010172521230
2.局部名称空间嵌套  
		先从自己的局部名称空间查找,然后由内而外依次查找
  
# 举例:
x = 'tes居然输了'
def func1():
    x = 1
    def func2():
        x = 2
        def func3():
            print(x)
            x = 3
        func3()
    func2()
func1()

案例中代码运行的顺序
image-20221010183013656

image-20221010183235705

嵌套函数内部的逻辑错误

作业

1.判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系
money = 100
def index():
    money = 666	
print(money)
  # 值为100,因为print 打印的变量名money 在当前的全局空间名称空间能找到,如果找不到接着是去内置名称空间中寻找,而不是在函数内的局部名称空间
   

money = 100
def func1():
    money = 666
    def func2():
        money = 888
    func2()
print(money)
  # 值为100,因为print 打印的变量名money 在当前的全局空间名称空间中能找到  money=100
posted @ 2022-10-10 19:02  Duosg  阅读(69)  评论(0编辑  收藏  举报