zoukankan      html  css  js  c++  java
  • 28-高级特性之作用域(2)

    1. 原理

    L:local,局部作用域,即函数中定义的变量;
    E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
    G:global,全局变量,就是模块级别定义的变量;
    B:built-in,系统固定模块里面的变量,比如int, bytearray等。
    搜索变量的优先级顺序依次是:局部作用域>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

    x = int(10) #python内置作用域B
    y = 2 #当前模块中的全局变量G
    def outfuction():
        outfx = 2 #外层作用域E
        def infunction():
            infx = 3 #局部作用域L
    

    2. 作用域产生的场景

    • 会引入新的作用域:module,class,def

    • 不会引入新的作用域:if,for,try--except

    • 注意:如果在外部引用局部变量,本质已经变成“在外部定义或者引用了一个新的全局变量”,如:

      x = 123 #全局G
      def test_1():
      x = 345 #局部变量x是L,屏蔽了作为G的x
      print(x) #345

      test_1() #345
      print(x, ' ') #123,这里的x是G

      def test_2():
      y = 456 #局部变量y
      print(y)

      test_2() #456
      y = 'haozhang' #等价于创造了新的全局变量y
      print(y) #haozhang
      test_2() #456

    在函数内部却要访问全局变量:用global

    x = 1
    def outfx():
        global x  #global改变了G区变量
        print(x)   #1
        x = 2
    outfx()
    print(x)   #2
    

    内部函数访问嵌套的父函数的变量:用nonlocal

    def outfx():
        x = 1 
        def infx():
            nonlocal x  #nonlocal改变了E区变量
            x = 2
            print(x) #2
        infx()
        print(x)    #2
    outfx()
    

    3. 参考文献:

    http://blog.csdn.net/ldzhangyx/article/details/49475159

  • 相关阅读:
    iOS app版本更新CheckVersion_Swift
    ios插件化开发
    开源框架RSA_Swift
    iOS SKStoreProductViewController的应用
    FMDB的使用
    iOS的MVP设计模式
    iOS UI帧率优化经验
    SKStoreReviewController之程序内评价
    Axure使用chrome插件
    修改每次《创建》项目maven仓库的默认路径
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504512.html
Copyright © 2011-2022 走看看