名字空间,L,E, G , B 作用域, 内置电池

名字,赋值与名字空间

 

名字空间与局部作用域L,全局作用域G
在《程序设计语言——实践之路》里的术语,将名字和与其绑定的对象之间的关系,称为约束。赋值语句就是约束建立的地方。
约束既然是(name,obj)这样的关联关系,约束关系的容身之地便是就是名字空间(字典对象)

 locals()是指一个局部作用域,globals()是指全局作用域。两个名字空间都是字典对象。
正常在模块中可以使用 globals()['__name__'] 
得到'__main__', 可以看到名字空间的dict特性
 
不在任何一个函数体内的时候locals()和globals()指向的使用一个对象, locals() is globals()
>>> globals()
{'__name__': '__main__', '__doc__': None,
'__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'source_code': " base_string='julyedu.com' def test1(a,b): return a+b def test2(c): x=7 print(c**2+x) ",
'base_string': 'julyedu.com', 'test1': <function test1 at 0x00000000033889D8>, 'test2': <function test2 at 0x00000000033868B8>,
'str': " base_string='julyedu.com' def test1(a,b): return a+b def test2(c): x=7 print(c**2+x) print(5+6)",
'l1': [1, 2, 3, 4, 5, '6'], 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': '6', 'd1': {'name': 'machine learning 5th', 'add': 'BJ,SH,*'}}

LEGB关于GL的作用域等之后再补,,,,pass

内置电池:

是一个内置的电池模块 module '__builtins__',内置了常用的最基础的一些对象和函数还有异常,

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError',
'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError',
'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit',
'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError',
'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning',
'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_',
'__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all',
'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright',
'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr',
'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals',
'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed',
'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] >>>

 可以看到有所有常用的基础对象和函数。可以知道为什么命名的时候不建议使用这些基本数据类型和常用的对象函数名字,因为这样就无法像之前那样调用内置电池中的功能来,会将这些基础对象改换指向,之前的内容可能被释放。

未加解释的变量默认找寻的名字空间顺序LEGB,

  • Local 可能是在一个函数或者类方法内部。
  • Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部(设计闭包)。
  • Global 代表的是执行脚本自身的最高层次。(即所有函数的最外面)
  • Built-in 是Python为自身保留的内置电池(__builtin__)
  •  我们在不希望函数中定义的变量被自动回收时可以选择使用nonlocal关键字使得变量外部可见。

都找不到才会报错。即从内向外找。

L通常指的就是函数内部的,

 
原文地址:https://www.cnblogs.com/zy1120192493/p/13122306.html