名称空间

扫码查看

一、名称空间:存放名字的空间

名称空间分类:

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
01-08 21:44
查看更多