zoukankan      html  css  js  c++  java
  • python全栈闯关--10-1、命名空间和作用域

    1、引子

    a = 1
    def func():
        print(a)
    func()

    函数func中,可以使用函数外的变量a,这就涉及到命名空间和作用域。

    2、命名空间

    命名空间分三种

    1、内置命名空间 —— python解释器

      内置命名空间在python一启动的时候就可以使用

      内置的名字,启动解释器的时候,就加载进内存里

    2、全局命名空间 —— 自己写得代码但不是函数中的代码

      从下到下执行代码的时候加载进内存

      存放了设置的变量名和函数名

    3、内置命名空间 —— 函数

      函数内部定义的名字

      当函数调用时,才产生这个命名空间,随之函数的执行结束,这个命名空间也就消失

     

    在局部:可以使用全局和内置命名空间的名字

    在全局:可以使用内置命名空间中的名字,但是不能用局部命名空间的

    在内置:不能使用全局和局部命名空间中的名字

    def max(l):
        print("in max func")
    print(max([1,2,3,4]))

    执行结果

    正常情况下,我们可以直接使用内置的名字

    但是,如果在全局定义了和内置名字一样的名字是,会使用全局的名字

    多个函数,拥有多个独立的局部命名空间,不共享

    3、函数的调用和地址

    def input():
        print("in input now!")
    
    def func():
        print(input)  # 打印的结果为函数的地址,并不会执行函数
    func()

    func → 不加括号,获取的是函数的地址

     函数名()→ 调用函数

    函数的内存地址()→ 调用函数

    4、作用域

    全局作用域 —— 作用全局 —— 内置和全局命名空间中的名字都属于全局作用域 —— gloabs()

    局部作用域 —— 作用局部 —— 函数(局部命名空间中的名字属于局部作用域)  —— locals()

    # 在全局作用域,globals和locals一样
    print(globals())
    print(locals())
    
    # 在局部作用域,globals显示全局作用域的名字,locals只显示局部作用域的名字
    def func():
        a = 1
        b = 2
        print(globals())
        print(locals())
    func()

    globals()永远打印全局名字

    locals()根据local所在位置,打印

    对于全局作用域的不可变数据类型的变量,在局部作用域不可变。

    如果需要修改,需要使用global参数申明

    a = 1
    def func1():
        a += 1  # 更改全局的变量,报错local variable 'a' referenced before assignment
    func1()
    
    a = 1
    def func1():
        global a
        a += 1  # 更改全局的变量,由于申明了global a程序可以执行
    func1()
    print(a)  # 因为申明了global,变量改变

    使用global参数,更改变量的值,存在危险性。

    不看函数代码时,无法知道变量是否改变。

    因此,在改变全局域变量时,采取传值——返回值的方式进行

    a = 1
    def func(a):
        a = 2
        return a
    a = func(a)
    print(a)
  • 相关阅读:
    设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
    设计模式系列之外观模式(Facade Pattern)——提供统一的入口
    设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
    设计模式系列之组合模式(Composite Pattern)——树形结构的处理
    设计模式系列之工厂模式三兄弟(Factory Pattern)
    设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
    设计模式系列之原型模式(Prototype Pattern)——对象的克隆
    动态追踪技术之SystemTap
    一次内核 crash 的排查记录
    LLVM Coding Standards
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11646414.html
Copyright © 2011-2022 走看看