python基础教程:函数作用域

枫铃3年前 (2021-09-30)Python245

在python中,一个函数就是一个作用域

name = 'xiaoming'

def change_name():
    name = 'sthu'
    print('在change_name里的name:',name)

change_name()  # 调用函数
print("在外面的name:",name)

运行结果如下:

在change_name里的name: sthu
在外面的name: xiaoming

我们再试一下在嵌套函数中是如何的寻找的?

age = 15
def func():
    print('第一层age:',age)  # 第一层age: 15

    def func2():
        age = 73
        print("func2中的age:",age)  # func2中的age: 73

        def func3():
            age = 84
            print("func3中的age:",age)  # func3中的age: 84

        func3()  # 调用func3函数

    func2()  # 调用func2函数

func()

在以上嵌套函数中,就能够很好的说明一个函数就是一个作用域,那么我们现在稍微改一下代码看看情况?

'''
Python大型免费公开课,适合初学者入门
加QQ群:579817333 获取学习资料及必备软件。
'''
age = 15
def func():
    print('第一层age:',age)  # 第一层age: 15

    def func2():
        print("func2中的age:",age)  # func2中的age: 15  # 看到没有,如果当前作用域里没有age变量,那么它就会往上找

        def func3():
            age = 84
            print("func3中的age:",age)  # func3中的age: 84

        func3()  # 调用func3函数

    func2()  # 调用func2函数

func()

那么,这时候有人就说了,屁话一大堆讲的原来是局部变量和全局变量,那么我想问:在上面这个嵌套函数中,func2中并没有age变量,那么它是如何找到全局变量age = 15的?

此时我们就需要来看一下作用域的查找顺序了:

变量作用域LEGB

  • L:locals 函数内的名称空间,包括局部变量和实参
  • E:enclosing 外部嵌套函数的名称空间,即相邻的上一层,打个比方说:func2中没有age变量则会去func里找这个
  • G:globals 全局变量
  • B:builtins 内置模块的名称空间

咳咳,还是先了解下什么是名称空间把?

名称空间,又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,x = 1 ,1存放在内存当中,那么变量名x存放在哪里呢?名称空间就是存放名字x与1绑定关系的地方

>>> x = 1
>>> id(1)
1576430608

名称空间分为以下3种:

  • locals: 是函数内的名称空间,包括局部变量和形参
  • globals: 全局变量,函数定义所在模块的名字空间
  • builtins: 内置模块的名字空间

不同变量的作用域不同就是有这个变量所在的命名空间决定的.

作用域即范围

  • 全局范围:全局存活,全局有效
  • 局部范围:临时存货,局部有效

让我们来举例看一下

level = 'L0'
n = 22

def func():
    level = 'L1'
    n = 33
    print(locals())  # {'n': 33, 'level': 'L1'}  在之前说过在python中,一个函数就是一个作用域,这就很完美的体现了
    def outer():
        n = 44
        level = 'L2'
        print(locals(),n)  # {'level': 'L2', 'n': 44} 44

        def inner():
            level = 'L3'
            print(locals(),n) # {'level': 'L3', 'n': 44} 44
        inner()
    outer()

func()

以 L --> E --> G -->B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置函数中找。

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。