zoukankan      html  css  js  c++  java
  • python知识点@命名空间

    python命名空间

    命名空间:来描述一个变量的动作。命名空间是一个字典(dictionary),它的键就是变量名,它的值就是我们给变量赋值的值。

    def fun():
        a =10
        print(a)
    fun()
    print(a)
    输出:
    10
    Traceback (most recent call last):
      File "F:/VSA4.0/TestFrameWork(1)/zzytest/day1/demo12-1.py", line 5, in <module>
        print(a)
    NameError: name 'a' is not defined
    

    从上面我们可以知道在python解释器开始执行代码之后, 就会在内存中开辟一个fun函数的空间、a变量的空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 这就是命名空间。

    我们定义函数的时候, 解释器只是把函数名fun读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.所以我们a的变量就没有定义,解释器就给我们返回报错

    命名空间分类:

    1. 全局命名空间—> 函数外声明的变量都属于全局命名空间
    a =10 #a变量属于全局命名
    def fun():
        a =10
        print(a)
    fun()
    
    1. 局部命名空间—> 在函数中声明的变量会放在局部命名空间
    def fun():
        a =10  a =10 #a变量属于局部命名
        print(a)
    fun()
    
    1. 内置命名空间—> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    命名空间取值顺序:

    当我们写代码要使用变量a的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

    a= 20
    print(id(a))
    def fun():
        a =10
        print(id(a))
        print(a)
    fun()
    print(a)
    print(id(a))
    输出:
    1662936544
    1662936384
    10
    20
    1662936544
    

    从上面我们可以分析到加自己的经验:

    1、 局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 a,或一个参数 a,Python 将使用它,然后停止搜索。

    2、 全局命名空间:特指当前的模块。如果模块定义了一个名为 a 的变量,函数或类,Python 将使用它然后停止搜索。

    3、 内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 a 是内置函数或变量。

    4、 如果 Python 在这些名字空间找不到 a,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'a' is not defined。

    命名空间作用域:

    作用域: 作用域就是使用变量数据的值的取值范围, 按照取值范围来看分为全局作用域和局部作用域

    1、全局作用域: 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐⾏执行)

    2、局部作用域: 在函数内部可以使用

    a= 20 #全局作用域
    print(id(a))
    def fun():
        a =10 #局部作用域
    fun()
    

    globals() 、locals() 函数的使用

    globals() 查看全局作⽤用域中的内容
    locals() 查看局部作⽤用域中的变量量和函数信息

    a = 100
    def func():
        a = 28
        print(a)
        print(globals())
        print(locals())
    func()
    #输出:
    {'name': 'main', 'doc': None, 'package': None, 'loader':
    <_frozen_importlib_external.SourceFileLoader object at 0x00000224FF94F8B0>
    , 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>,
    'file': 'F:/studyPythonDemo/day01/demo01-1/demo01-7.py', 'cached':
    None, 'a': 100, 'func': <function func at 0x00000224FFA97B80>}
    {'a': 28}
    

    从上代码我们可以看出 全局变量其他的输出是内置变量的值,'a': 100

  • 相关阅读:
    Spread for Windows Forms快速入门(11)数据筛选
    Spread for Windows Forms高级主题(7)自定义打印的外观
    Spread for Windows Forms高级主题(6)数据绑定管理
    使用WiX制作具有时间限制的安装包
    Spread for Windows Forms高级主题(2)理解单元格类型
    如何添加ActiveReports 6导出PDF时的安全设置和数字签名
    Spread for Windows Forms快速入门(10)绑定到数据库
    当心那些有歧义的命名
    【翻译】会有Silverlight6吗?
    Spread for Windows Forms快速入门(12)数据分组(Outlook风格)
  • 原文地址:https://www.cnblogs.com/gxj521test/p/13599470.html
Copyright © 2011-2022 走看看