作用域

什么是命名空间

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

globals、locals

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

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

  • locals

In [2]: A = 100

In [3]: B = 200

In [4]: def test():
   ...:     a = 11
   ...:     b = 22
   ...:     print(locals())
   ...:     

In [5]: test()
{'b': 22, 'a': 11}

In [6]:
  • globals

In [11]: globals()
Out[11]: 
{'A': 100,
 'B': 200,
 'In': ['',
  "get_ipython().system('ls -F --color ')",
  'A = 100',
  'B = 200',
  'def test():\n    a = 11\n    b = 22\n    print(locals())\n    ',
  'test()',
  'A = 100',
  'B = 200',
  'def test():\n       ...:     a = 11\n       ...:     b = 22\n       ...:     print(locals())\n       ...:     \n        ',
  'test()',
  "{'b': 22, 'a': 11}",
  'globals()'],
 'Out': {10: {'a': 11, 'b': 22}},
 '_': {'a': 11, 'b': 22},
 '_10': {'a': 11, 'b': 22},
 '__': '',
 '___': '',
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__loader__': None,
 '__name__': '__main__',
 '__package__': None,
 '__spec__': None,
 '_dh': ['/home/itcast/python/python/day02'],
 '_exit_code': 0,
 '_i': "{'b': 22, 'a': 11}",
 '_i1': 'ls',
 '_i10': "{'b': 22, 'a': 11}",
 '_i11': 'globals()',
 '_i2': 'A = 100',
 '_i3': 'B = 200',
 '_i4': 'def test():\n    a = 11\n    b = 22\n    print(locals())\n    ',
 '_i5': 'test()',
 '_i6': 'In [2]: A = 100',
 '_i7': 'In [3]: B = 200',
 '_i8': 'In [4]: def test():\n       ...:     a = 11\n       ...:     b = 22\n       ...:     print(locals())\n       ...:     \n        ',
 '_i9': 'In [5]: test()',
 '_ih': ['',
  "get_ipython().system('ls -F --color ')",
  'A = 100',
  'B = 200',
  'def test():\n    a = 11\n    b = 22\n    print(locals())\n    ',
  'test()',
  'A = 100',
  'B = 200',
  'def test():\n       ...:     a = 11\n       ...:     b = 22\n       ...:     print(locals())\n       ...:     \n        ',
  'test()',
  "{'b': 22, 'a': 11}",
  'globals()'],
 '_ii': 'In [5]: test()',
 '_iii': 'In [4]: def test():\n       ...:     a = 11\n       ...:     b = 22\n       ...:     print(locals())\n       ...:     \n        ',
 '_oh': {10: {'a': 11, 'b': 22}},
 '_sh': <module 'IPython.core.shadowns' from '/usr/lib/python3/dist-packages/IPython/core/shadowns.py'>,
 'exit': <IPython.core.autocall.ExitAutocall at 0x7f52a387eeb8>,
 'get_ipython': <bound method TerminalInteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x7f52a388f898>>,
 'quit': <IPython.core.autocall.ExitAutocall at 0x7f52a387eeb8>,
 'test': <function __main__.test>}

In [12]:

LEGB 规则

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

locals -> enclosing function -> globals -> builtins
  • locals,当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量
  • enclosing,外部嵌套函数的命名空间(闭包中常见)
def fun1():
  a = 10
  def fun2():
      # a 位于外部嵌套函数的命名空间
      print(a)
  • globals,全局变量,函数定义所在模块的命名空间
a = 1
def fun():
  # 需要通过 global 指令来声明全局变量
  global a
  # 修改全局变量,而不是创建一个新的 local 变量
  a = 2
  • builtins,内建模块的命名空间。
Python 在启动的时候会自动为我们载入很多内建的函数、类,
  比如 dict,list,type,print,这些都位于 __builtins__ 模块中,
  可以使用 dir(__builtins__) 来查看。
  这也是为什么我们在没有 import任何模块的情况下,
  就能使用这么多丰富的函数和功能了。

  在Python中,有一个内建模块,该模块中有一些常用函数;在Python启动后,
  且没有执行程序员所写的任何代码前,Python会首先加载该内建函数到内存。
  另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,
  其原因是对函数、变量、类等标识符的查找是按LEGB法则,其中B即代表内建模块
  比如:内建模块中有一个abs()函数,其功能求绝对值,如abs(-20)将返回20。

      Python2.X版本中,内建模块被命名为 __builtin__
      Python3.X版本中,更名为 builtins
      Python2.X和Python3.X 是对内建模块一个引用 __builtins__

results matching ""

    No results matching ""