11 作用域

Posted 不要被骄傲遮蔽了双眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:内建空间

[email protected]:~/02-就业班/03-高级-$ ipython3

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

 

以上是关于11 作用域的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

作用域是什么?

JavaScript 作用域 与 作用域链

JS---闭包

这个代码片段有啥作用?

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用