1、名称空间内存:栈区+堆区,栈区存放的是变量名(内存地址),堆区存放的是变量值与栈区的变量名是映射关系(绑定关系)
名称空间:是虚拟概念,是对栈区的划分,本质还是存放变量名,只不过是对变量进行分区管理。
作用域:名称空间的向上砖取,也就是总结归类。
1.1 内置名称空间名称空间namespacs:存放名字的地方,是对栈区的划分
注:有了名称空间之后,就可以在栈区中存放相同的名字
存放的名字:存放的python解释器内置的名字:内置函数等
存活周期:python解释器启动则产生,python解释器关闭则销毁
print(print) #
print(input) #
print(max) #
# built-in 内建
1.2 全局命名空间
存放的名字:只要不是函数体定义、也不是内置的,剩下的都是全局名称空间的名字
存活周期:python文件执行则产生,python文件运行完毕后销毁
x = 10 # x全局名称
if 1:
y = 20 # y全局名称
if 2:
z = 30 # z全局名称
print(x,y,z) # 10 20 30
while 1:
a = 40 # a全局名称
break
print(a) # 40
def func(): # func全局名称
pass
class A: # A全局名称
pass
1.3 局部名称空间
存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁
def func(): # 全局名称空间
x = 12 # 局部名称空间
y = 20 # 局部名称空间
func()
注:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
1.4 名称空间的加载、销毁顺序
1.5 名字的查找优先级加载顺序:内置名称空间(打开python解释器立马产生)> 全局命名空间(执行py文件时产生)> 局部名称空间(调用函数时产生)
销毁顺序:局部名称空间(调用函数结束销毁)> 全局命名空间(py文件执行j结束销毁)> 内置名称空间(关闭python解释器销毁)
注:一个程序中局部名称空间名称空间可以有多个,每调用一次函数产生一个独立空间;内置、全局名称空间只有一个。
当前所在的位置向上一层一层查找
局部名称空间 > 全局名称空间 > 内置名称空间
max = 10
def func():
max = 20
print(max) # 20,打印局部max=20
func()
max = 10
def func():
# max = 20
print(max) # 20,打印全局max=10
func()
# max = 10
def func():
# max = 20
print(max) # ,打印内置max函数
func()
1.5.2 当前在全局名称空间
全局名称空间 > 内置名称空间
max = 1
print(max) # 1
# max = 1
print(max) #
2、作用域
2.1 全局作用域
2.2 局部作用域全局作用域:内置名称空间,全局名称空间
全局存活:从py文件执行开始生效,整个执行过程都有效
全局有效:被所有函数共享
3、global局部作用域::局部名称空间的名字
临时存活:调用函数时有效
局部有效:函数内有效
在局部修改全局的名字对应的值(不可变类型),需要用global,将局部作用域变成全局作用域
名称空间将内存栈区划分成三个区,向上砖取成两个作用域(全局作用域和局部作用域),两个作用域的名字互不影响,两个作用域出现相同的名字时,两个或多个相同的名字共存但是作用范围不同。
# 全局作用域和局部作用域互不影响
x = 10 # 全局变量x
def func():
x = 20 # 局部变量x,在内置名称空间中从新存储x变量,不能改变全局变量y,新的
func()
print(x) # 10
# global,将局部变量申明成全局变量
y = 10 # 全局变量y
def func():
global y # global将局部变量申明成全局变量,可以改变全局变量y,旧的
y = 20
func()
print(y) # 20
3、nonlocal
修改函数外层函数包含的名字对应的值(不可变类型)
def func():
x = 20 # 局部x
def func1():
x = 30 # 局部x,处局部x与外层函数局部x不相同(互不影响,内存地址不同),新的
func1()
print(x) # 20
func()
def func():
x = 20 # 局部x
def func1():
nonlocal x # nonlocal,申明此处局部x与外层函数局部x相同(可以影响,内存地址相同),旧的
x = 30
func1()
print(x) # 30
func()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)