Python名称空间与作用域

一. 名称空间: 用来存放变量名, 函数名, 模块名的内存空间

1. 名称空间分三大类: 将名称空间隔离成三块

1.1 内置名称空间: Python解释器自带的关键字,随解释器启动而产生,随解释器关闭而销毁

1.2 全局名称空间: 顶级的名字,顶头的if/while/for子代码中的名字也算顶级,随python程序启动而产生

1.3 局部名称空间: 在函数内部定义的名字,调用函数则产生,函数调用结束则销毁

2. 名字访问的优先级: 基于当前所在的位置向上查找,局部->全局->内置

3. 名称空间的嵌套关系是在函数定义阶段扫描语法的时候生成的

len = 111


def f1():
    print(len)


def f2():
    len = 333
    f1()


f2()  # 打印111
x = 11


def func():  # Python采用词法作用域,函数定义阶段扫描语法
    print(x)  # 定义阶段不管代码执行先后顺序和逻辑错误,只管扫描语法
    x = 22  # 扫描语法发现函数内有x,此时函数已确定从自己内找x


func()  # 代码逻辑问题,调用函数执行才管先后顺序,故执行报错

二. 作用域

1. 作用范围 LEGB = Local,External,Global,Built-in

1.1 全局作用域: 内置+全局名称空间中的名字, 全局存活, 全局有效

1.2 局部作用域: 局部名称空间中的名字, 临时存活, 局部有效

2. global, nonlocal

2.1 global: 在函数内, 声明名字是来自于全局的

l = [1, 2, 3]


def func():
    l[0] = 111  # 列表类型,改的是全局变量,若l=11,则只是函数局部内有效


func()
print(l)  # 打印[111, 2, 3]
x = 10


def func():
    global x
    x = 20


func()
print(x)  # 因为global声明全局,所以打印20

2.2 nonlocal: 在函数内, 声明名字是来自于外层函数的

x = 333


def f1():
    x = 111

    def f2():
        # global x  # 只会改全局的x=333,不管外层的x=111
        nonlocal x  # 改的外层的x=111,不会改全局的x=333,外层没有x=111则语法错误
        x = 222

    f2()
    print(x)


f1()
print(x)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值