zoukankan      html  css  js  c++  java
  • 函数2

    函数的命名空间:

      >内置:python解释器内置的

      >全局:自定义,整个文件内都可以访问.

      >局部:只能在函数内使用,外部无法访问.

    x1 = 100   #全局变量
    
    def func():
        x2 = 200    #局部变量
        print(x1)    #因为是全局变量,所以可以在函数内去访问
    
    print(func())
    print(x2)       #因为是局部变量,所以无法从函数外部去访问NameError: name 'x2' is not defined
    生命周期:

    内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
    全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
    局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

    关于命名空间,还有一句很经典的致简名言:

    """
    函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变 ---- jasonji
    """
    def func():
        x = 100
        print(x)
    
    x = 200
    func()   #由于函数在定义时,print(x),就已经锁定了函数内的x=100,所以,无论在哪里调用,x都只会等于100.  
    #而从另一个角度分析,func()函数内的x是定义在局部变量的命名空间内,而外部的x=200是定义在全局命名空间内,所以,再者并没有关系.再从一个简化的角度去理解,变量的查找顺序,总是会从离自己最近的地方开始找.
    #变量查找顺序:局部>>全局>>内置

    其实由上面的一个小例子,就可以解开很多疑惑,理清很多思绪.在python内部,一切都是有紊紊有条的存放的.局部命名空间->>>全局命名空间->>>内置命名空间.搞清楚他们之间的规则,也就不会被繁杂的调用所混淆了.

    关于函数的作用域:

    global:局部修改全局 如果想修改多个 逗号隔开
    x = 100
    
    def func():
        global x     #改变全局命名空间内x的值
        x = 200
    
    func()
    print(x)        #所以最终打印x的值是200

    nonlocal:局部修局部 如果想修改多个 逗号隔开
    def func1():
        x = 100
        def func2():
            nonlocal x  #改变当前局部命名空间内x的值
            x = 200
        func2()
        print(x)       #所以打印x结果是200
    
    func1()

    知其然,更要知其所有然.本着技多不压身的原则,了解多一点,再了解多一点.

  • 相关阅读:
    loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)
    loj#6073. 「2017 山东一轮集训 Day5」距离(费用流)
    洛谷P5108 仰望半月的夜空(后缀数组)
    二次剩余Cipolla算法学习笔记
    BZOJ5118: Fib数列2(二次剩余)
    BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
    loj#2531. 「CQOI2018」破解 D-H 协议(BSGS)
    noi.ac #289. 电梯(单调队列)
    51nod“省选”模测第二场 C 小朋友的笑话(线段树 set)
    HDU 4770 Lights Against DudelyLights
  • 原文地址:https://www.cnblogs.com/hellozizi/p/11164086.html
Copyright © 2011-2022 走看看