一、名称空间:存放名字的空间
名称空间分类:
1、内置名称空间
Python提前给你的定义的名字,就是存在内置名称空间
2、全局名称空间
存放于文件级(.py文件)别的名字,就是全局名称空间
注:(不在定义的函数内)if while for 内部定义的名字执行之后都放存放于全局名称空间
3、局部名称空间
函数内部定义的所有名字都是存放于当前函数的内置空间
二、生命周期
1、内置名称空间
在Python解释器启动的时候生效,关闭解释器的时候生效
2、全局名称空间
当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
3、局部名称空间
当你调用当前函数时生效,函数体代码执行结束就失效
名称空间的查找顺序:
局部:局部 > 全局 > 内置
注:函数内部使用的名字,在定义阶段已经规定死了,与你的调用空间有关
全局:全局 >内置
注:当内置再找不到就报错
作用域:
作用域分类:
1、全局作用域:全局可以调用的名字就存在于全局作用域
范围空间:内置名称空间 +全局名称空间
2、局部作用域:
局部可以调用的名字就存放在局部作用域
范围空间:局部名称空间
global:在局部声明全局变量 如:global x
nonlocal: 在局部名称空间声明局部
nonlocal x:在局部修改外部变量(只是修改上一层变量)
注:可变类型是可以在局部内(唯一不定义声明变量为全局或局部变量)可以修改外部(上一层)变量的值
x = 100 #全部作用域的名字x def foo(): x = 300 #局部作用域的名字x print(x) #在局部找x foo() #结果为300
x = 100 def foo(): x = 300 #在函数调用时产生局部作用域的名字x foo() print(x) #在全局找x,结果为100
在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间名称的值,当值为不可以变类型时,则需要用到global关键字
x = 1 def foo(): global x #声明x为全局名称空间的名字 x = 2 foo() print(x) #结果为2
当实参的值为可变类型时,函数体对该值得修改将直接反应到原值
num_list = [1,2,3] def foo(nums): nums.append(5) foo(num_list) print(num_list) #结果为 [1, 2, 3, 5]
对于嵌套多层的函数,使用nonlcoal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)
def f1(): x = 2 def f2(): nonlocal x x = 3 f2() #调用f2(),修改f1作用域中名字x的值 print(x)#在f1作用域查看x f1() 结果: 3