函数名称空间与作用域

名称空间

1. 什么是名称空间(namespaces)
	用于存放变量名与变量值绑定关系的地方

在这里插入图片描述

名称空间的分类

1. 内置名称空间
python解释器提前定义好的,例:
    print()
    len()
    ...
2. 全局名称空间
在py文件中定格写的代码运行之后全都会存入全局名称空间
name = 'tom'  # name全局
def func():  # func全局
    pass
if 1:
    a = 1  # a全局
for i in range(10):
    print(i)  # i全局
while True:
    a = 1  # a全局
3. 局部名称空间
在函数体代码运行之后产生的都是局部名称空间
def func():  # func全局
	a = 1  # a局部

def func1():  # func1全局
    b = 2  # b局部
# 局部名称空间之间互不干扰  函数嵌套除外!!!
4.名称空间存活周期
1.内置名称空间
	python解释器启动与关闭而创建和销毁
2.全局名称空间
	随着py文件的运行与结束而创建和销毁
3.局部名称空间
	随着函数体代码的执行与结束而创建和销毁

在这里插入图片描述

名字的查找顺序

# 在查找名字的时候 要先确定自己在哪
	1. 如果在局部
    	局部 >>> 全局 >>> 内置
    2. 如果在全局
    	全局 >>> 内置
     
# 局部名称空间的嵌套
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)
                # x = 555  特例  写在print下面,会报错
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()

’x’ 查找循序流程图如下

Created with Raphaël 2.3.0 开始 f4局部 print(x) 结束 f3局部 f2局部 f1局部 全局名称空间 报错 yes no yes no yes no yes no yes no

在这里插入图片描述

名称空间的作用域

作用域
	名称空间所能够作用的范围

内置名称空间
	程序任何阶段任何位置均可使用(全局有效)
全局名称空间
	程序任何阶段任何位置均可使用(全局有效)
局部名称空间
	一般情况下只在各自的局部名称空间中有效

global与nonlocal关键字使用

1.global使用
x = 111
def func():
    #局部想修改全局变量需要使用关键字声明
    global x
    x = 222
func()
print()  # 222

list1 = [11, 22]
def func1():
    list1.append(333)
func1()
print(list1)  # [11, 22, 333]
'''
如果想在局部修改全局数据
	如果数据为不可变类型则需要关键字global声明
	如果数据为可变类型则不需要关键字global声明
'''
2.nonlocal使用
def func():
    x = 111
    def func1():
        # 内部局部修改外部局部
        nonlocal x
        x = 222
    func1()
    print(x)  # 222
func()


def func():
    l1 = [11, 22]
    def func1():
        l1.append(33)
    func1()
    print(x)  # [11, 22, 33]
func()
'''
如果想要在内部的局部修改外部局部的不可变类型需要用nonlocal声明
	可变类型不需要声明
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值