函数调用与 名称空间

1.名称空间(变量,函数,内置函数)

"""
什么是名称空间?
    存放名字的空间

如果你想访问一个变量值,必须先方向对应的名称空间,拿到名字和对应的内存地址的绑定关系

名称空间的分类:
    1、内置名称空间:
        python提前给你的定义完的名字,就是存在内置名称空间  如:len max 等内置函数
    2、全局名称空间
        存放于文件级别的名字,就是全局名称空间
        if while for 内部定义的名字执行之后都存放于全局名称空间
    3、局部名称空间
        函数内部定义的所有名字都是存放与当前函数的内置名称空间

生命周期:
    1、内置名称空间
        在python解释器启动的时候生效,关闭解释器的时候失效
    2、全局名称空间
        当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
    3、局部名称空间
        当你调用当前函数时生效,函数体最后一行代码执行结束就失效
名称空间的查找顺序:

"""

2.查找顺序

"""
名称空间的查找顺序:
    局部:局部 > 全局 > 内置
    全局:全局 > 内置  # 内置再找不到就报错
# 函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关
"""

# x = 1
#
# def wrapper():  # 定义
#     x = 2
#     index()  # 定义里面包含调用
# def index():  定义
#     x = 3
#     print(x)
#
# wrapper()      #调用:先定义 后调用



####
# x = 1
# def inner():
#     x = 2
#     def wrapper():
#         print(x)
#     wrapper()      #调用
#
# inner()

####
def index():

    x = 2
    # print(x)

print(x)

x = 1

def index(arg = x):
    print(x)
    print(arg)

x = 2
index()

3.作用域

"""
作用域的分类:
    1、全局作用域
        全局可以调用的名字就存在于全局作用域

        内置名称空间+全局名称空间
    2、局部作用域
        局部可以调用的名字就存放与局部作用域
        局部名称空间

global:声明全局变量(***)
nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*)

只有可变类型可以在局部修改外部变量的值 (*****)
"""

# x = 1
#
# def index():   # 定义
#     global x    # 声明为全局变量并修改值
#     x = 2
# index()        # 调用 :在定义阶段,函数只会被读,不会被执行,一旦被调用 函数体会被执行
# print(x)

########  函数先定义 后执行,函数体内的执行语句不会被执行,只有被调用的时候才会执行
# l1 = []
# def index(a):
#     l1.append(a)
#     print(l1)
# index(1)
#
# print(l1)

########  局部变量的修改无法影响只能影响到上一层
def index():
    x = 1
    def index2():
        nonlocal x   
        x = 2
    index2()
    print(x)
index()
#  例题 :
def f3():
    x = 4
    def f1():
        y = 2
        def f2():
            nonlocal x
            x = 3
        f2()
        print(x)
    f1()
    print(x)
f3()           结果 33

猜你喜欢

转载自www.cnblogs.com/bigbox/p/11837654.html