返回顶部
首页 > 资讯 > 后端开发 > Python >名称空间与作用域
  • 477
分享到

名称空间与作用域

作用名称空间 2023-01-31 00:01:02 477人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录 名称空间(掌握) 内置名称空间 全局名称空间 局部名称空间 加载顺序 查找顺序

目录

  • 名称空间(掌握)
    • 内置名称空间
    • 全局名称空间
    • 局部名称空间
    • 加载顺序
    • 查找顺序
  • 作用域(掌握)
    • 全局作用域
    • 局部作用域
    • 注意点
    • 函数对象+作用域应用
  • 补充知识点(了解)
    • global关键字
    • nonlocal关键字
    • 注意点

函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况。

def f1():
    def f2():
        print('from f2')
    f2()

f2()  # NameError: name 'f2' is not defined

名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是在内存中开辟了一个新的空间。但是我们一直在回避变量名的存储,其实在内存中有一块内存存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间。

内置名称空间

内置名称空间:存放Pyhton解释器自带的名字,如int、float、len

生命周期:在解释器启动时生效,在解释器关闭时失效

全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、l、z

生命周期:在文件执行时生效,在文件执行结束后失效

x = 1


def func():
    pass


l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

局部名称空间

局部名称空间:用于存放函数调用期间函数体产生的名字,如下面代码的f2

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

def f1():
    def f2():
        print('from f2')
    f2()

f1() 

46名称空间与作用域-简单.png

加载顺序

由于.py文件是由python解释器打开的,因此一定是在Python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置--》全局--》局部。

查找顺序

由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,一定是从三者之一找到,查找顺序为:
从当前的所在位置开始查找,如果当前所在的位置为局部名称空间,则查找顺序为:局部--》全局--》内置。

x = 1
y = 2
len = 100


def func():
    y = 3
    len = 1000
    print(f"y: {y}")
    print(f"len: {len}")
    # print(a)  # NameError: name 'a' is not defined


func()
y: 3
len: 1000
x = 1


def func():
    print(x)


x = 10
func()
10

域指的是区域,作用域即作用的区域。

46名称空间和作用域-地图.jpg

全局作用域

全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。

# 全局作用域
x = 1


def bar():
    print(x)


bar()
1

局部作用域

局部作用域:局部有小,临时存储,只包含局部名称空间。

# 局部作用域
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    f2()


f1()
2

注意点

需要注意的是:作用域关系在函数定义阶段就固定死了,与函数的调用无关。

# 作用域注意点
x = 1


def f1():  # 定义阶段x=1
    print(x)


def f2():
    x = 2
    f1()


f2()
1

函数对象+作用域应用

# 作用域应用
def f1():
    def inner():
        print('from inner')
    return inner


f = f1()  # 把局部定义的函数放在全局之中


def bar():
    f()


bar()
from inner

global关键字

修改全局作用域中的变量。

x = 1


def f1():
    x = 2

    def f2():
        #         global x  # 修改全局
        x = 3
    f2()


f1()
print(x)
1
x = 1


def f1():
    x = 2

    def f2():
        global x  # 修改全局
        x = 3
    f2()


f1()
print(x)
3

nonlocal关键字

修改局部作用域中的变量。

x = 1


def f1():
    x = 2

    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)


f1()
2
x = 1


def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)


f1()
3

注意点

  1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
  2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
lis = []


def f1():
    lis.append(1)


print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")
调用函数前: []
调用函数后: [1]

--结束END--

本文标题: 名称空间与作用域

本文链接: https://lsjlt.com/news/181999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 名称空间与作用域
    目录 名称空间(掌握) 内置名称空间 全局名称空间 局部名称空间 加载顺序 查找顺序 ...
    99+
    2023-01-31
    作用 名称 空间
  • Python名称空间与作用域
    目录一 名称空间1.1 内建名称空间1.2 全局名称空间1.3 局部名称空间二 作用域2.1 全局作用域与局部作用域2.2 作用域与名字查找的优先级一 名称空间 名称空间即存放名字与...
    99+
    2024-04-02
  • python名称空间与作用域详情
    目录一、名称空间1.1 内置名称空间1.2 全局名称空间1.3 局部名称空间1.4 加载顺序1.5 查找顺序二、作用域2.1 全局作用域2.2 局部作用域2.4 函数对象+作用域应用...
    99+
    2024-04-02
  • Python名称空间与作用域实例分析
    本篇内容主要讲解“Python名称空间与作用域实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python名称空间与作用域实例分析”吧!一 名称空间名称空间即存放名字与对象映射/绑定关系的...
    99+
    2023-06-30
  • Python名称空间及作用域怎么用
    今天小编给大家分享一下Python名称空间及作用域怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。名称空间什么是名称空间...
    99+
    2023-06-26
  • Python基础教程之名称空间以及作用域
    目录前言名称空间什么是名称空间名称空间的意义名称空间的查找顺序局部名称空间详解嵌套函数中的查找顺序关于嵌套函数的使用作用域什么是作用域global语句nonlocal语句题目题目小结...
    99+
    2024-04-02
  • 命名空间和作用域
    一、命名空间 一、命名空间的分类: 1、内置命名空间——python解释器: python解释器启动就可以使用的名字存储在内置内存空间; 内置的名字在启动解释器的时候就被加载进内存,如input()、print()等等。 2、全局命名空间...
    99+
    2023-01-31
    作用 空间
  • 关于Python函数对象的名称空间和作用域
    目录1.函数对象(1)函数对象的引用(2)函数可以放到序列里面(3)函数可以作为参数 , 传递给另一个函数(4)函数可以作为另一个函数的返回值2.名称空间3.作用域(1)作用域的理解...
    99+
    2023-05-17
    Python 函数 Python 函数作用域 Python 函数名称空间
  • 解密Python中的作用域与名字空间
    目录楔子变量只是一个符号变量的可见性LGB 规则局部变量是静态存储的LEGB 规则global 表达式属性空间小结楔子 前面我们介绍了栈帧,在里面看到了 3 个独立的名字空间:f_l...
    99+
    2023-02-28
    Python作用域 名字空间 Python作用域 Python 名字空间
  • Python 作用域和命名空间
    在介绍类之前,我首先要告诉你一些Python的作用域规则。类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情。顺便说一下,关于这个主题的知识对任何高级Python程序员都很有用。 让我们从一些定...
    99+
    2023-01-31
    作用 空间 Python
  • Python函数命名空间和作用域(Local与Global)
    目录1.Local作用域2.Enclosing function locals作用域3.Global全局变量4.非局部变量nonlocal5.就近原则6.函数执行顺序7.循环、判断代...
    99+
    2024-04-02
  • 解读Python编程中的命名空间与作用域
    变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。 一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量...
    99+
    2022-06-04
    作用 空间 Python
  • Python作用域与名字空间源码学习笔记
    目录作用域与名字空间1. 名字绑定1.1 赋值1.2 模块导入1.3 函数、类定义1.4 as关键字2. 作用域2.1 静态作用域2.2 划分作用域2.3 闭包作用域2.4 类作用域...
    99+
    2024-04-02
  • Python中的作用域与名字空间实例分析
    这篇文章主要介绍“Python中的作用域与名字空间实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的作用域与名字空间实例分析”文章能帮助大家解决问题。变量只是一个符号从解释器的角...
    99+
    2023-07-05
  • Python命名空间与作用域深入全面详解
    目录1.命名空间2.作用域全局变量和局部变量global 和 nonlocal关键字1.命名空间 先看看官方文档的一段话: 命名空间(Namespace)是从名称到对象的映射,大部...
    99+
    2022-11-13
    Python作用域 Python命名空间
  • Python学习之名字,作用域,名字空间
    目录变量只是一个名字作用域和名字空间LGB规则eval和exec前言: 我们在PyFrameObject里面看到了3个独立的名字空间:f_locals、f_globals、f_bui...
    99+
    2024-04-02
  • C++ 名称空间详情
    目录一、传统的C++命名空间二、新的命名空间特性1.using声明和using编译指令2.名称空间的其他特性一、传统的C++命名空间 声明区域(declaration region)...
    99+
    2024-04-02
  • C++名称空间介绍
    目录1.名称空间1.1传统C++名称空间1.2新的名称空间特性1.名称空间 在C++当中,名称可以是变量、函数、结构体、枚举、类以及结构体和类的成员。这本身并没有问题,但随着项目的...
    99+
    2024-04-02
  • C++名称空间特性
    目录一、名称空间特性1.嵌套2.传递3.别名4.匿名名称空间文章转自微信公众号:Coder梁(ID:Coder_LT) 一、名称空间特性 1.嵌套 我们可以将名称空间声明进行嵌套: ...
    99+
    2024-04-02
  • Python学习之名字,作用域,名字空间(下)
    目录LEGB规则global表达式属性引用与名字引用属性空间小结前言: 这里再回顾一下函数的local空间,首先我们往global空间添加一个键值对相当于定义一个全局变量,那么如果往...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作