精华内容
下载资源
问答
  • 在Python解释器开始执行之后,机会在内存中开辟一个空间,每当遇到一个变量的时候,就把变量值之间的关系记录下来,但是当遇到函数定义的时候,解释器只是把函数名读入内存,表示这个函数存在,至于函数内部的变量...

    准备知识:

    1.在Python解释器开始执行之后,机会在内存中开辟一个空间,每当遇到

    一个变量的时候,就把变量和值之间的关系记录下来,但是当遇到函数定义

    的时候,解释器只是把函数名读入内存,表示这个函数存在,至于函数内部

    的变量和逻辑,解释器是不关心的。也就是说一开始的时候函数只是加载进

    来,仅此而已,只有当函数被调用和访问的时候解释器才会根据函数内部声

    明的变量来进行开辟变量的内部空间。随着函数执行完毕,这些函数内部变

    量占用的空间也会随着函数执行完毕而清空。

    例子:

    def fun():

    a = 10000

    print(a)

    fun()

    print(a) # a不存在了了已经..

    2.命名空间

    在一个Python程序的任何一个地方,都存在几个可用的命名空间。

    我们存放名字和值的关系的空间起个名字,叫命名空间。

    我们的变量在存储的时候就存在这片空间的。

    (1)分类:

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

    它记录了函数的变量,包括函数的参数和局部定义的变量。

    2)每个模块都拥有自己的命名空间,叫做全局命名空间,

    它记录了模块的变量,包括函数、类、其他导入的模块、

    模块级的变量和常量。

    3)还有就是内置命名空间,任何模块均可访问,它存放着

    内置的函数和异常。

    加载顺序:内置命名空间,全局命名空间,局部命名空间(函数被执行)

    取值顺序:局部命名空间,全局命名空间,内置命名空间

    注意:嵌套函数的情况

    1.先在当前(嵌套的或lambda)函数的命名空间搜索

    2.然后是在父函数的命名空间中搜索

    3.接着是模块命名空间中搜索

    4.左后在内置命名空间中搜索

    (2)生命周期:

    命名空间的生命周期不同的命名空间在不同的时刻创建,

    有不同的生存期。

    1、内置命名空间在 Python 解释器启动时创建,

    会一直保留,不被删除。

    2、模块的全局命名空间在模块定义被读入时创建,

    通常模块命名空间也会一直保存到解释器退出。

    3、当函数被调用时创建一个局部命名空间,当函

    数返回结果或抛出异常时,被删除。每一个递归

    调用的函数都拥有自己的命名空间。

    3.作用域

    L :local,局部作用域,即函数定义的变量

    E :enclosing,嵌套的父级函数的局部作用域,

    即包含此函数的上级函数的局部作用域但不是全局

    G :global,全局变量,就是模块级别定义的变量。

    B :built-in,系统固定模块里面的变量。比如int等。

    搜索变量的优先级顺序:LEGB

    1.globals() 和 locals()

    globals() 获取到全局作用域(内置,全局)中的所有名字

    locals() 查看当前作用域中的所有名字

    例子:

    a = 10

    def func():

    a = 20

    print(a) # 就近原则

    print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字

    print(locals()) # locals() 查看当前作用域中的所有名字

    func()

    打印内容:

    (1)#20

    (2)#{'__name__': '__main__', '__doc__': None, '__package__': None,

    # '__loader__': <_frozen_importlib_external.sourcefileloader object at>,

    # '__spec__': None, '__annotations__': {}, '__builtins__': ,

    #'__file__': '/Users/busensei/wzy/test.py', '__cached__': None, 'a': 10,

    #'func': }

    (3)#{'a': 20}

    2. global 和 nonlocal

    global:寻找全局作用域中的内容(声明在局部作用域里使用全局作用域的变量)

    nolocal :声明在局部作用域里,使用上层局部作用域的变量, 且上层不可以是全局变量

    通过例子来加深理解:

    <1>

    a = 10

    def func():

    global a # a 不再是局部变量. 是全局变量

    a = 30 # 把全局中的a重新赋值成30

    print(a) #30

    func()

    print(a) #30

    <2>

    a = 10

    def func1():

    a = 40

    def func2():

    nonlocal a # 找局部作用域中 离他最近的那个变量引入进来

    a = 20

    print(a)#20 这时被引入的变量a的值从40变成了20

    func2()

    print(a)#20 这时这层的a已经被20所覆盖

    func1()

    print(a)#10 nonlocal是在他外层找到值停止,如果没有到全局就回报错,不会到全局

    结果:

    20

    20

    10

    <3>

    a = 10

    def fun1():

    a = 20

    def fun3():

    def fun2():

    nonlocal a

    a = a + a

    print(a)#40

    fun2()

    fun3()

    print(a)#40

    fun1()

    print(a)#10

    结果:

    40

    40

    10

    <4>

    a = 10

    def fun1():

    def fun3():

    b = 30

    def fun2():

    global a

    nonlocal b

    a = a + b

    print(a)#40

    fun2()

    fun3()

    print(a)#40

    fun1()

    print(a)#40

    结果:

    40

    40

    40

    a = 1

    def fun_1():

    a = 2

    def fun_2():

    nonlocal a

    a = 3

    def fun_3():

    a = 4

    print(a)

    print(a)

    fun_3()

    print(a)

    print(a)

    fun_2()

    print(a)

    print(a)

    fun_1()

    print(a)

    结果:

    1

    2

    3

    4

    3

    3

    1

    展开全文
  • 名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区划分作用:名称空间可以使栈区中存放相同名字,从而解决命名冲突名称空间分为三种:内置名称空间全局名称空间局部名称空间内置...

    名称空间

    名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分

    作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突

    名称空间分为三种:

    内置名称空间

    全局名称空间

    局部名称空间

    内置名称空间

    内置名称空间:用于存放Python解释器中内置的名字

    生命周期:Python解释器启动则产生,Python解释器关闭则销毁

    例如:print、input、int ...

    全局名称空间

    全局名称空间:运行顶级代码所产生的名字,或者说除函数内定义以及内置的外,剩下的都是全局名称空间

    生命周期:Python文件执行时产生,Python文件执行完毕后销毁

    例如:

    # 变量名a

    a = 1

    # 函数名func

    def func():

    pass

    # 类名MyClass

    class MyClass:

    pass

    局部名称空间

    局部命名空间:在调用函数时,运行函数体代码过程中产生的函数内的名字

    生命周期:函数调用时产生,函数调用完毕后销毁

    例如:

    def func(x, y):

    pass

    func(1, 2)

    名称空间的先后顺序

    名称空间加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间

    名称空间销毁顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间

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

    作用域

    全局作用域

    全局作用域:内置名称空间、全局名称空间

    特点:

    全局存活

    全局有效:被所有函数共享

    局部作用域

    局部作用域:局部名称空间

    特点:

    临时存活

    局部有效:函数内有效

    LEGB原则

    找寻变量的调用顺序采用LEGB原则(即就近原则)

    B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)

    G —— Global(module); 函数外部所在的命名空间 (全局作用域)

    E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)

    L —— Local(function);当前函数内的作用域 (局部作用域)

    依据就近原则,从下往上 从里向外 依次寻找

    global与nonlocal

    global:声明全局变量获修改全局变量

    nonlocal:修改局部变量(当前函数上一层的局部变量)

    # global的使用

    x = 1

    def func():

    global x

    x = 2

    func()

    print(x)

    # nonlocal的使用

    def func1():

    x = 1

    def func2():

    nonlocal x

    x = 2

    func2()

    print(x)

    func1()

    总结

    名称空间是对栈的一种划分,真正存在的是栈区。名称空间只是一种虚拟的划分

    名称空间只有优先级之分,并无没有嵌套关系

    名称空间的“嵌套关系”决定了名字的查找顺序

    名称空间的“嵌套关系”以函数定义阶段为准

    以上就是浅析Python的命名空间与作用域的详细内容,更多关于python 命名空间与作用域的资料请关注聚米学院其它相关文章!

    展开全文
  • 本文说下自己对 Python 命名空间和作用域的理解。注意:内容基于 Python 3.6命名空间A namespace is a mapping from names to objects.命名空间,直译是名称到对象(比如数字、字符串等)的映射,(我的理解是)这些名称...

    本文说下自己对 Python 命名空间和作用域的理解。

    注意:内容基于 Python 3.6

    命名空间

    A namespace is a mapping from names to objects.

    命名空间,直译是名称到对象(比如数字、字符串等)的映射,(我的理解是)这些名称构成一个命名空间。一般有三种命名空间

    内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。

    全局名称(global names),模块中定义的名称。

    局部名称(local names),函数中定义的名称。(类中定义的也是)

    看个例子就清楚了

    命名空间的生命周期各不相同

    内置命名空间在编译器启动开始建立,直到程序结束

    全局命名空间,在模块文件读入后建立,直到程序结束。

    局部命名空间,在函数被调用后建立,函数退出时结束。递归函数每次调用都会建立不同的命名空间。对于类来说类似,实例化后建立,实例销毁后结束。

    Python很容易学!所以小编有弄一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都欢迎你来!:548+377+875!一起 学习共同进步!

    作用域

    A scope is a textual region of a Python program where a namespace is directly accessible. “Directly accessible” here means that an unqualified reference to a name attempts to find the name in the namespace.

    作用域,是 Python 代码中的一段文本区域,在这个区域里能「直接」访问一个命名空间中的名称。所谓「直接」,就是只要给出名称(如 some_name)就能找到命名空间中的对应的名称,而不需要使用类似 modulename.subname 或是 object.attribute 等这样的方式。

    有四种作用域:

    local scope,最内层,包含 local names,(搜索名称时)最先被搜索

    nonlocal scope, 如果一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal

    global scope,包含 global names

    builtin scope, 包含 built-in names,最后被搜索

    其中,需要强调的是 local scope 和 nonlocal scope 是一个相对的概念。如果一个模块中,函数 A 直接包含了函数 B , B 又直接包含了函数 C 。如果以 C 中的名称作为参考,那么 C 中的作用域为 local scope,则 B 中的作用域就为 nonlocal scope。如果以 B 中的名称作为参考,那么 B 中的作用域是 local scope, 则 A 中的作用域为 nonlocal。如果以 A 中的名称作为参考,那么 A 中的作用域是 local scope,不过要注意,模块中的作用域始终为 global scope,这时并没有 nonlocal scope。

    对于赋值操作,默认都是操作当前作用域中包含的名称。假设现在在 local scope,如果要对 nonlocal scope 包含的名称进行赋值,则要用 nonlocal 关键字。如果要对 global scope 中包含的名称赋值要用 global 关键字。需要注意的是,如果在某个作用域内没有对应的名称,则在对应的作用域中会新增。 下面的例子可以帮你理解赋值操作

    输出为

    对应读值操作,都是由内到外进行搜索。即 local scope -> nonlocal scope -> global scope -> builtin scope,如果都找不到对应的名称,则报错。

    如果要读取指定作用域的名称,则可以使用对应的 nonlocal 或 global 关键字,如果对应作用域找不到该名称,则直接报错。

    当然,如果当前作用域已有同名的名称,就不能使用这 nonlocal 或 global 了,否则会报错。

    第一个报的是语法错误,而第二个是运行时报的错误。这说明了一个问题:局部名称的查找是编译时就确定的,而全局名称和内置名称的查找都是在运行时确定的。(这里只是指出来,了解下就行,暂时没必要深入)

    小结

    个人觉得,没必要太在意命名空间和作用域的定义,之所以有命名空间的说法,只是为了引入作用域的概念。

    我们只需要清楚两个方面的内容:一是,哪个作用域包含哪些名称;二是,相反的,赋值和读值的时候它又是指向哪个作用域,并理解 nonlocal 和 global 的使用。

    展开全文
  • globalnonlocal 关键字 1 global关键字可以将局部变量变成一个全局变量 格式 : global 变量名称 a = 10 print(id(a)) def func() global a #变成了全局变量 a = 20 #修改全局变量值 print(id(a)) #id ...

    global和nonlocal 关键字

    1  global关键字可以将局部变量变成一个全局变量

    格式 : global 变量名称

    a = 10 
    print(id(a))
    def func()
        global a     #变成了全局变量
        a = 20       #修改全局变量的值
        print(id(a)) #id 相同
        print(a)
    func()
    prinr(a)

    nonlocal 关键字可以修改外层(全局变量)变量

    def outter():
        name = 'zs'
        def inner():
            nonlocal name    #和outter中的name是同一个变量
            name = '赵四'
        inner
        print(name)             #赵四
    outter()
    print(name)                #赵四

    命名空间和作用域的关系


    命名空间定义了在某一个作用域内,变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值一一对应。
    作用域定义了命名空间中的变量能够在多大范围内起作用

    展开全文
  • 命名空间和作用域命名空间命名空间是名字和对象映射。也就是可以把一个命名空间理解为一个字典,实际上很多当前Python实现命名空间就是用字典。各个命名空间是独立,没有任何关系的,所以一个命名空间中不能...
  • 原标题:Python 中命名空间与作用域介绍来源:南枝向暖北枝寒MA【导语】:对命名空间和作用域认识很模糊?不清楚?为了让大家有清晰认识,本文详细介绍了命名空间类型及作用域,希望能让你对python有更深刻认识...
  • Python中变量作用域的问题NameSpace(命名空间)有着很大的关系命名空间是从名字到对象的一个映射。它其实就是一个dict。具体来说,就是Python为模块,类,对象,函数保存一个__dict__里边就是从名称到对象的映射...
  • Python3 命名空间和作用域 命名空间 先看看官方文档一段话: A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从...
  • 命名空间几乎所有语言都有类似机制,在Python中命名空间分三种,局部、全局内建。或(四种,嵌套局部作用域在Python中叫闭包 Enclosing)定义名称到对象映射。命名空间是一个字典实现,键为变量名,值是...
  • Python 命名空间和作用域命名空间作用域全局变量和局部变量global 和 nonlocal关键字 命名空间 命名空间(Namespace)是从名称到对象映射,大部分命名空间都是通过 Python 字典来实现。 命名空间提供了在项目中...
  • 命名空间和作用域

    2018-08-29 09:36:00
    命名空间和作用域  程序运行时,遇到全局变量时,会在内存开辟一块空间,将变量与其值的内存地址的关系,存入此空间,这个空间称为全局内存空间 程序调用函数时,遇到函数的变量,会在内存中再开辟一块临时空间,...
  • Python命名空间和作用域 命名空间 命名空间(Namespace)是从名称到对象映射,大部分命名空间都是通过 Python 字典来实现。 命名空间提供了在项目中避免名字冲突一种方法。各个命名空间是独立,没有任何关系...
  • 全局命名空间局部命名空间内置命名空间python代码运行时候遇到函数是怎么做从python解释器开始执行之后,就在内存中开辟了一个空间,每当遇到一个变量时候,就把变量名值之间对应关系记录下来。...
  • Python3命名空间和作用域 ''' ''' 命名空间(Namespace):从名称到对象映射,大部分命名空间都是通过 Python 字典来实现。 命名空间提供了在项目中避免名字冲突一种方法。 各个命名空间是独立,没有任何...
  • 名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区划分作用:名称空间可以使栈区中存放相同名字,从而解决命名冲突名称空间分为三种:内置名称空间全局名称空间局部名称空间内置...
  • 文章目录Python3-命名空间和作用域介绍1. 命名空间 Python3-命名空间和作用域介绍 1. 命名空间 命名空间(Namespace) 是从名称到对象映射,大部分命名空间都是通过 Python 字典来实现。 命名空间提供了在项目中...
  • 命名空间是用来存放名字与对象绑定关系的。比如a=1,Python会申请内存空间存放对象1,然后将x与1绑定关系存放在命名空间中。Python的命名空间是相互独立。同一命名空间中不能有重名,不同的命名空间中可以有重名...
  • 命名空间几乎所有语言都有类似机制,在Python中命名空间分三种,局部、全局内建。或(四种,嵌套局部作用域在Python中叫闭包 Enclosing)定义名称到对象映射。命名空间是一个字典实现,键为变量名,值是...
  • 二者的关系命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见摸得着的实体存在的。大部分的命名空间都是由字典来实现的,里面存储的是键就是名字,值就是名字所指向的位于内存中的对象。作用域是...
  • 一、函数的命名空间 命名空间:name space是从名称(name)到对象(object)上映射。 当一个name映射到一个object上时,这个name这个object就有了绑定(bind)关系,或者说这个name指向了这个object。 每个...
  • x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1内存地址,即 名称空间是存放了变量x与1绑定关系的地方 名称空间共3种 :locals: 是函数内名称空间,包括局部变量形参...
  • 各个命名空间是独立,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。 我们举一个计算机系统中例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有...
  • 1、命名空间I) 定义: 1)命名空间... 3)各个命名空间是独立,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。 例如: 我们举一个计算机系统中例子,一个文件...
  • 命名空间的分类 1、内置的命名空间:python解释器中的,如print(),input()等 2、全局命名空间:是在程序从上到下被执行过程中...各个命名空间中之间的关系 1、在局部,可以使用全局、内置命名空间中的名字 2、在全...
  • 命名空间(Namespace)是从名称到对象映射2、实现:大部分的命名空间都是通过 Python 字典来实现3、目的:命名空间提供了在项目中避免名字冲突一种方法4、各个命名空间是独立,没有任何关系的,所以一个命名...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 424
精华内容 169
关键字:

命名空间和作用域的关系