命名空间(namespace)

名称到对象的映射。命名空间是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。命名空间也被叫做名称空间。

分类

python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。按照变量定义的位置,可以划分为以下3类:

局部命名空间(Local)

每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。

全局命名空间(Global)

每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。

内置命名空间(Built-in)

python自带的内置命名空间,随着python解释器的启动而产生,包括异常类型、内置函数和特殊方法,可以代码中任意地方调用。

一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# -*- coding: UTF-8 -*-
# filename: test.py

#全局命名空间的变量对象s
s = "Hello"

#全局命名空间的函数对象hello
def hello(name):
    #局部命名空间的变量对象h
    h = s + name
    #函数对象print是随Python解释器启动而来的,属于内置命名空间。
    print(h)

hello(" Tom")  #输出 Hello Tom

上面例子中,变量s和函数hello是test.py模块中定义的,属于全局命名空间。print函数是Python内置的,属于内置命名空间。函数hello里定义的变量h,属于局部命名空间。

生命周期

Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。 Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出。 Built-in(内置命名空间)在python解释器启动时创建,一直保留直到解释器退出。

各命名空间创建顺序:python解释器启动 ->创建内置命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间

各命名空间销毁顺序:函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内置命名空间

命名空间的访问

1、通过builtins模块可以访问内置命名空间。它是随Python解释器而启动的,不需要import。

打印内置命名空间所有的内置(异常类型、函数和特殊方法)

例如:

1
2
3
import builtins
for i in dir(builtins):
    print(i)

执行以上程序会输出如下结果:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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
ZeroDivisionError
__build_class__
__debug__
__doc__
__import__
__loader__
__name__
__package__
__spec__
abs
all
any
ascii
bin
bool
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

2、全局 (模块级别)命名空间可以通过globals()内置函数来访问。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# -*- coding: UTF-8 -*-
# filename: test.py
import sys

#全局命名空间的变量对象s
s = "Hello"

#全局命名空间的函数对象hello
def hello(name):
    #局部命名空间的变量对象h
    h = s + name
    #函数对象print是随Python解释器启动而来的,属于内置命名空间。
    print(h)

#输出test.py的全局命名空间
print(globals())

执行以上程序会输出如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{'__spec__': None,
'__builtins__': <module 'builtins' (built-in)>,
'__package__': None, '__file__': '/home/main.py',
'__doc__': None,
'__name__': '__main__',
'__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f9820b1e048>,
'sys': <module 'sys' (built-in)>,
'__cached__': None,
's': 'Hello',
'hello': <function hello at 0x7f9820b4abf8>}

模块的名字空间不仅仅包含模块级的变量和常量,还包括所有在模块中定义的函数和类。除此以外,它还包括了任何被导入到模块中的东西(例子中的sys模块)

3、局部命名空间可以locals()内置函数来访问。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# -*- coding: UTF-8 -*-
# filename: test.py
import sys

#全局命名空间的变量对象s
s = "Hello"

#全局命名空间的函数对象hello
def hello(name):
    #局部命名空间的变量对象h
    h = s + name
    #输出hello函数的内部命名空间
    print(locals())

hello(" Tom")

执行以上程序会输出如下结果:

1
2
{'h': 'Hello Tom',
'name': ' Tom'}

转载请注明本网址。