15.命名空间与作用域

本文深入探讨了Python中的命名空间,包括内置、局部和全局命名空间的定义、生命周期及查找顺序。同时,解释了作用域的概念,区分了全局和局部作用域,并介绍了`global`和`nonlocal`关键字的使用。通过示例代码展示了命名空间的动态行为和作用域规则,帮助读者理解Python中变量的生命周期和查找机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.命名空间

命名空间 namespace又称名称空间 :存放名字的地方,是对栈区的划分
有了命名空间,就可以在栈区中存放相同的名字,命名空间分三种:

1.内置命名空间:

存放的名字:python解释器内置的名字:如print、int、……
存活周期:python解释器启动则产生,python解释器关闭则销毁

2.局部命名空间:

存放的名字:只要不是函数内定义的,也不是内置的,都是全局命名空间
import os

x=10

if 10>3:
    y=2

def func():
    pass
存活周期:python文件执行则产生,python文件运行完毕后销毁

3.全局命名空间

存放的名字:调用函数时,运行函数体代码过程中产生的函数体内的名字
存活周期:在函数调用时存活,函数调用完毕后则销毁
def func(x=1,y=2):
    print(x,y)

func()
func()
# 每调用一次,都会新产生一次

4.命名空间的加载顺序

内置命名空间--->全局命名空间---->局部命名空间

5.命名空间的加载顺序

内置命名空间<---全局命名空间<----局部命名空间

6.名字的查找优先级:当前所在的位置,向上一层一层查找

内置命名空间
全局命名空间
局部命名空间
如果在局部命名空间内:
局部命名空间--->全局命名空间---->内置命名空间
input=666
def func():
    input=555
    print(input)
func()#555
如果在全局命名空间内:
全局命名空间---->内置命名空间
input=666
def func():
    input=555
func()
print(input)#666


def func():
    input=555
func()
print(input)#<built-in function input>
从一个命名空间找不到,去另一个命名空间找,物理从层面上,三个空间并没有包含关系,而是区域划分

示例1:

def func():
    print(x)
x=1111
func()#1111

示例2:

命名空间的“嵌套”关系是以函数定义阶段为准的,与调用位置无关
x=1
def func():
    print(x)

def foo():
    x=2
    func()

foo()#1

示例3:函数嵌套定义

input=111
def f1():
    def f2():
        input=333
        print(input)
    input=222
    f2()

f1()#333

示例4:

在函数定义的时候,虽然不会执行,但会监测函数体语法正确性,在此过程中,变量的命名空间就已经确定好了,所以一旦被调用,就会在确定好的命名空间内找变量,找不到就报错。
x=111
def func():
    print(x)
    x=222

func()#UnboundLocalError: local variable 'x' referenced before assignment
x=111
def func():
    print(x)
    # x=222
func()#111

2.作用域=》作用范围

1.全局作用域:内置命名空间、全局命名空间

1.全局存活
2.全局有效:被所有函数共享
x=11
def foo():
    print(x,id(x))
def bar():
    print(x,id(x))
foo()
bar()
# 11 1565551680
# 11 1565551680

2.局部作用域:局部命名空间的名字

1.临时存活
2.局部有效:函数内有效
LEGB 约定俗成的作用域查找范围,先从l(local)往外查找。了解即可。
#builtin
#global
def f1():
    #e
    def f2():
        #enclosing
        def f3():
            #local
            pass

3.global与nonlocal

global 想要在局部修改全局的不可变类型
x=111
def func():
    global x
    x=222
print(x)#111
func()
print(x)#222
nonlocal (了解):修改函数外层函数不可变类型变量名对应的值
x=0
def f1():
    x=11
    def f2():
        global x
        x=22
    f2()
    print('f1内的x:',x)

#f1()#f1内的x: 11
x=0
def f1():
    x=11
    def f2():
        nonlocal x
        x=22
    f2()
    print('f1内的x:',x)

f1()#f1内的x: 22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值