zoukankan      html  css  js  c++  java
  • python 变量搜寻顺序法则LEGB之E注意事项

    众所周知,在python中,变量不需要事先声明,赋值后,即可调用使用。而调用的法则遵从LEGB法则,其中L为local,E为enclosing,G为Global,B为built-in,即变量首先在局部搜索,比如一个函数中,如果没有搜寻到,则继续在enclosing中搜寻,比如嵌套函数中更靠外侧的函数,如果还是没有,则搜索全局变量,如果还是没有,就搜索内建变量名,最终找不到的话,则抛出异常。当然,值得一提的是,如果定义了nonlocal,那么将不遵从LEGB法则。

    今天要总结的重点是,虽然class 也提供local scope,但是它与函数进行嵌套时,不会产生enclosing的范围,即它嵌套的函数,实际上是class 的方法,不构成enclosing scope,其调用的变量需要通过instance,或者class 获取,但其与外层的def 构成enclosing scope,对外层的变量可以直接获取。下面上代码:

    def generate():
        class spam:
            count=1
            def method(self):
                print(spam.count)
        return spam()

    这段代码中,method与class并不形成enclosing scope,获取count,只能通过spam。

    如果method直接打印count,如下:

    def generate():
        class spam:
            count=1
            def method(self):
                print(count)
        return spam()
    >>> generate().method()
    Traceback (most recent call last):
      File "<pyshell#15>", line 1, in <module>
        generate().method()
      File "<pyshell#14>", line 5, in method
        print(count)
    NameError: name 'count' is not defined

    而当count位于两个def 之间时,就构成了enclosing scope,就可以直接调用获取,如下:

    def generate():
        count=1
        class spam:
            def method(self):
                print(count)
        return spam()

    运行:

    >>> generate().method()
    1
    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    索引与慢查询优化
    视图 触发器 事物 储存过程 内置函数 流程控制
    多表查询
    having distinct 正则 limit order by 排序
    Mysql基本查询语句及方法
    Python基础之列表内置方法
    Python基础之流程控制while循环
    Python基础之格式化输出的三种方式
    计算机基础之编程与编程语言
    计算机组成
  • 原文地址:https://www.cnblogs.com/johnyang/p/10397565.html
Copyright © 2011-2022 走看看