python名称空间和函数名

python名称空间和函数名

名称空间

#名称空间
命名空间提供了在项目中避免名字冲突的一种方法
各个命名空间是独立的,没有任何关系的
一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响

'''其实就是存放变量名与变量值绑定关系的地方'''

#名称空间的分类

1.内置名称空间

python解释器提前定义好的
	len() print() open()
    
2.全局名称空间	

'在py文件中编写的代码运行产生的名字都会存到全局名称空间'

 name = 'jason'  # 变量名name存入全局名称空间
    def index():  # 函数名index存入全局名称空间
        pass
    if True:
        a = 111  # 变量名a存入全局名称空间
    for i in range(10):  # 变量名i存入全局名称空间
        pass
    while True:
        b = 222  # 变量名b存入全局名称空间

 3.局部名称空间

  	函数体代码运行产生的都是局部名称空间
    def index():
      name = 'jason'  # name存入局部名称空间

# 存活周期

'命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束
'
'我们无法从外部命名空间访问内部命名空间的对象'

  1.内置名称空间
  	python解释器运行 产生
    python解释器关闭 销毁
  2.全局名称空间
  	py文件开始运行 产生
    py文件运行结束 销毁
  3.局部名称空间
  	函数体代码开始运行 产生
    函数体代码运行结束 销毁

名字查找顺序

1.如果在局部名称空间
	局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2.如果在全局名称空间
	全局名称空间 >>> 内置名称空间
    #代码示例:
    len = '我是全局名称空间中的len'
def index():
    len = '我是局部名称空间中的len'
    print(len)
index()  # 调用函数 函数体就会执行 就会产生局部名称空间
print(len)

'''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''

作用域

'作用域就是一个 Python 程序可以直接访问命名空间的正文区域'

#内置名称空间
	程序任意阶段任意位置均可使用(全局有效)
#全局名称空间
	程序任意阶段任意位置均可使用(全局有效)
#局部名称空间	
	一般情况下只在各自局部名称空间中有效(局部有效)
    #代码示例:
    g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域
        

global与nonlocal关键字

当内部作用域想修改外部作用域的变量时
就要用到 globalnonlocal 关键字

#代码示例:
ddd = 11
def index():
    global ddd	# 申明 修改的是全局x而不是产生新的x
    ddd=222
    print(ddd)

index()


"""
如果想要在局部修改全局的不可变类型
    需要提前加关键字global申明
如果想要在局部修改全局的可变类型
    不需要加关键字global申明
"""
#代码示例:
def index():
    x = 111  # 在index的局部产生一个x=111
    l1 = [11, 22, 33]
    def f1():
        nonlocal x # 局部名称空间嵌套 内层修改外层
        x = 333
        l1.append(44)
    f1()
    print(x)
    print(l1)
index()


函数名的多种用法

#用法1:函数名可以当做变量名赋值
print(index)
res = index  # 让res也指向函数体代码
print(res)
res()  # index()



#用法2:函数名还可以当成函数的实参
def index():
    print('from index')
def func(a):
    print('from func')
    print(a)
    a()
func(index)

# 用法3:函数名还可以当做函数的返回值
def func():
    print('from func')
    return index  # 将函数名当做返回值
def index():
    print('from index')
res = func()  # res接收函数名
print(res)  # 指向的是index函数的内存地址
res()  # index()

# 用法4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>:列表、元组、字典'''
def index():
    print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
l1[-1]()  #  index()

函数的嵌套

我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变
#代码示例:
def outer():
    name = "python"

    def inner():#outer函数内部定义的函数
        print(name)
    return inner()#返回该内部函数

outer()

def my_max(a,b):
    '''返回两个数中的较大值'''
    if a > b:
        return a
    return b
# print(my_max(100,999))

posted @   洛阳城门听风雨  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示