11 作用域

1.命名空间

什么是命名空间

比如有一个学校,有10个班级,在7班和8班中都有一个叫“小王”的同学,如果在学校的广播中呼叫“小王”时,7班和8班中的这2个人就纳闷了,你是喊谁呢!!!如果是“7班的小王”的话,那么就很明确了,那么此时的7班就是小王所在的范围,即命名空间

 

globals、locals

在之前学习变量的作用域时,经常会提到局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域

 

>>> globals()
{'__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, 'a': 100, '__spec__': None, '__package__': None}
>>> 

 

 

>>> def test():
...     a = 100
...     b = 200
...     print(locals())
... 
>>> test()
{'b': 200, 'a': 100}
>>> 

 

 

2.LEGB 规则

Python 使用 LEGB 的顺序来查找一个符号对应的对象

locals -> enclosing function -> globals -> builtins
  • locals,当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量
  • enclosing,外部嵌套函数的命名空间(闭包中常见)
  • globals,全局变量,函数定义所在模块的命名空间
  • builtins,内建模块的命名空间。

 

  1)版本1

 num = 100
 def test():
     num = 200  #当前所在命名空间
     print(num)
 
 test()

 

 

  2)版本2:自己有用自己的

num = 100
def test():
    num = 200
    def test_in():
        num = 300
        print(num)
    return test_in

ret = test()
ret()


####
300

 

  3)版本3:自己没有到上一层

num = 100
def test():
    num = 200  #外部嵌套函数的命名空间(闭包中常见)
    def test_in():
 #       num = 300
        print(num)
    return test_in

ret = test()
ret()


####
200

 

 

 

   4)版本4:全局变量

num = 100     #全局变量,函数定义所在模块的命名空间
def test():
    # num = 200  
    def test_in():
 #       num = 300
        print(num)
    return test_in

ret = test()
ret()


####
100

 

 

  5)版本5:内建空间

python@ubuntu:~/02-就业班/03-高级-$ ipython3

In [2]: dir(__builtin__)
Out[2]: 
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'BlockingIOError',
 'BrokenPipeError',
 'BufferError',
 'memoryview',
 'min',
 'next',
 'object',
 'oct',
 'open',]

 

posted @ 2017-12-01 09:34  venicid  阅读(175)  评论(0编辑  收藏  举报