Python基础---函数(三)

44 篇文章 0 订阅
34 篇文章 0 订阅
本文详细介绍了Python中的命名空间,包括局部、全局和内置命名空间的定义、访问方式及加载顺序,以及查找顺序的三种情况。同时,文章探讨了作用域的概念,分类如Local、Enclosing、Global和Built-in,并解析了Python搜索作用域的规则。此外,还阐述了局部变量和全局变量的差异,以及如何通过global和nonlocal关键字来管理变量的作用域。
摘要由CSDN通过智能技术生成

目录

一、命名空间

1.定义

(1)局部命名空间

(2) 全局命名空间

(3)内置命名空间 

2.访问 

(1)局部名称空间访问

(2)全局命名空间的访问

 3.加载顺序

4.查找顺序

(1)第一种情况

(2)第二种情况 

(3)第三种情况

二、作用域

1.定义

2.分类

(1)Local

(2)Enclosing

(3)Global

(4)Built-in

3.搜索

(1)第一次

(2)第二次

(3)第三次 

(4)第四次 

三、局部变量与全局变量 

1.定义

2.实现 

(1)局部变量和全局变量

(2)全局变量的两种情况

四、global和nonlocal关键字

1.global关键字

(1)使用前

(2)使用后

2. nonlocal关键字

(1)使用前

(2)使用后


一、命名空间


1.定义

Python的命名空间的本质是一个字典,用来记录变量名称和值。

字典的key是变量的名称,字典的value对于的是变量的值。例如 {‘name’:’zs’,’age’:10}

命名空间一共分为三种:

(1)局部命名空间

每个函数都有自己的命名空间,叫做局部空间

记录的是参数以及在函数体中声明的变量

def func():
    a=19
    b=20
    print('azy')

(2) 全局命名空间

每个模块(整个py文件)拥有它自已的命名空间,叫做全局命名空间

记录的是整个py文件中的变量、函数、类

def func():
    a=19
    b=20
    print('azy')
print(func)

 

(3)内置命名空间 

记录的是内置函数,任何模块均可访问它

print(print)
print(id)
print(type)

 

2.访问 

(1)局部名称空间访问

使用 locals() 函数

 

(2)全局命名空间的访问

使用globals()函数

 

 

 3.加载顺序

内置命名空间(程序运行前加载)->

全局命名空间(程序运行中:从上到下加载)->

局部命名空间(程序运行中:调用时才加载)

4.查找顺序

(1)第一种情况

思路:

'''
先从局部命名空间中查找,
if 能找到:
    返回局部命名空间中的值
else:
    再从全局命名空间中查找
    if 能找到:
        返回全局命名空间中的值
    else:
        再从内置命名空间中查找
        if 能找到:
            返回内置命名空间中的值
        else:
            报错
'''

实现: 

 

(2)第二种情况 

思路:

如果一开始就从全局命名空间中查找,就直接找全局命名空间中的内容,

如果找到则停止搜索,如果找不到,就向内置命名空间中查找,如果查找到就给返回内容,查不到就报错。

实现:

(3)第三种情况

思路:

自己的变量名不要和内置函数的变量名相同,否则不能使用内置命名空间中的函数功能

实现:


二、作用域


1.定义

作用域指的是变量在程序中的可应用范围

2.分类

作用域按照变量的定义位置可以划分为4类即LEGB:

(1)Local

局部作用域(函数内部)---->函数体中声明的变量

(2)Enclosing

嵌套作用域(闭包)(嵌套函数的外层函数内部)----->嵌套函数中外层函数体中声明的变量

(3)Global

全局作用域(模块全局)---->py文件中声明的变量

(4)Built-in

内置作用域(内建)---->Python提供的变量(函数)

3.搜索

Python搜索4个作用域:

[本地作用域(L)---->上一层结构中def或者lambda的本地作用域(E)---->全局作用域(G)---->内置作用域(B)(即python的内置类和函数等)]

在第一处能够找到这个变量名的地方停下来

如果变量名在整个的搜索过程中都没有找到,Python就会报错

(1)第一次

(2)第二次

(3)第三次 

(4)第四次 


三、局部变量与全局变量 


1.定义

在函数中定义的变量称为局部变量,只在函数内部生效; 

在程序一开始定义的变量称为全局变量,全局变量的作用域是整个程序。

2.实现 

(1)局部变量和全局变量

 

(2)全局变量的两种情况

全局变量是不可变数据类型,函数无法修改全局变量的值

name = 'zs'  
def func():
    name = 'ls' 
    print(name)
func()
print(name)

 

 全局变量是可变数据类型,函数可以修改全局变量的值

直接修改

a = 10
lst = [1, 2, 3]
def func():
    a = 30
    print(a)
    lst.append(4)
func()
print(a)
print(lst)

 

间接修改

a = 10
lst = [12, 3]
def func(c, lst1):
    c = 20
    lst1.append(4)
    print(c, lst1)
func(a, lst)
print(a, lst)

 

 


四、global和nonlocal关键字


1.global关键字

可以将局部变量变成一个全局变量

格式: global 变量名称

(1)使用前

age=16
def nj():
    age=20
    print(age)
nj()
print(age)
print('*'*30)

 

(2)使用后

修改全局变量

age=16
def nj():
    global age
    age=20
    print(age)
nj()
print(age)
print('*'*30)

 

2. nonlocal关键字

可以修改外层(非全局)变量

格式:nonlocal 变量名称

(1)使用前

age=16
def nj():
    age=18
    def nj2():
        age=20
        print(age)
    nj2()
    print(age)
nj()
print(age)
print('*'*30)

 

(2)使用后

age=16
def nj():
    age=18
    def nj2():
        nonlocal age
        age=20
        print(age)
    nj2()
    print(age)
nj()
print(age)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值