zoukankan      html  css  js  c++  java
  • python-17-命名空间和作用域

    前言

    命名空间:既是我们平时在写python中写的代码变量/函数/类等命名,有时候你发现命名不能重复或者出现冲突这些都关系着命名空间。

    作用域:可以直接访问命名空间的正文区域,从内到外依次访问所有的作用域直到找到,找不到咋办?报错呗,说白了就是这个命名我去哪里找到你呢。

    一。命名空间

    python 中避免命名冲突的一种方法,各个独立,没有任何关系,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

    命名空间有三种:

    1.内置命名空间:
      ①就是python解释器一启动就可以使用的名字存储在内置命名空间中
      ②内置的名字在启动解释器的时候被加载进内存里
      ③在内置:不能使用局部和全局的名字的

    2.全局命名空间:
      ①是在程序从上到下被执行的过程中依次加载进内存的
      ②放置了我们设置的所有变量名和函数名
      ③在全局:可以使用内置命名空间中的名字,但是不能用局部中使用

    3.局部命名空间:
      ①函数内部定义的名字
      ②当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
      ③在局部:可以使用全局、内置命名空间中的名字

    下面搞两个例子:

    1.先找内部命名空间:

    # 在全局定义和内置命名同名时,会使用全局的名字
    # 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。
    def input():
        print('你瞎搞!!!')
    
    def func(input):
        input()         # 我调用函数 input
        input = 22      # 打印 input 就是先找到我
        print(input)
    
    func(input)

    2.内部没有就找全局的:

    # 在全局定义和内置命名同名时,会使用全局的名字
    # 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。
    
    def input():
        print('你瞎搞!!!')
    
    def func():
        return input
    
    func()()

     二。作用域

    作用域两种:
    1.全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()——只打印全局的名字

    2.局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()——只打印局部的名字

    nonlocal:只能用于局部变量(对全局无效),声明一个上层,最近的函数局部变量能进行所有操作。

    # 不可变数据类型 在局部可查看全局作用域中的变量,但是不能直接修改。
    # 如果要修改,需在程序的开始声明:global
    # 在局部(函数)内声明了global 变量,则在局部中的变量所有操作将对对全局有效。
    
    a = 0
    def func():
        global a                       # 声明:global a,即可以操作,未声明会报错
        a += 10
        b = 222
        print('局部作用域:', locals())   # 查看局部空间作用域
        print('全局作用域:', globals())  # 查看全局空间作用域
    
    print('声明前:', a)                 # 未调用声明函数前
    func()
    print('声明后', a)                  # 调用声明的函数后

    欢迎来QQ交流群一起学习:482713805

  • 相关阅读:
    Enum 枚举值 (一) 获取描述信息
    sqlbulkcopy 批量更新 数据库
    linq partition by
    C#委托的介绍(delegate、Action、Func、predicate)ga
    安装Tomcat
    安装 oracle
    468 Validate IP Address 验证IP地址
    467 Unique Substrings in Wraparound String 封装字符串中的独特子字符串
    464 Can I Win 我能赢吗
    463 Island Perimeter 岛屿的周长
  • 原文地址:https://www.cnblogs.com/gsxl/p/12385980.html
Copyright © 2011-2022 走看看