Skip to content

Commit e826812

Browse files
committed
变量的作用域
变量的作用域
1 parent 3f2ade0 commit e826812

File tree

3 files changed

+108
-1
lines changed

3 files changed

+108
-1
lines changed

python_advance/main.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* [模块和包](模块和包.md)
77
* [通用日志模块](通用日志模块.md)
88
* [变量的作用域与闭包](变量的作用域.md)
9+
* [Python命名空间与作用域](命名空间与作用域.md)
910
* [装饰器](装饰器.md)
1011
* [进程与线程概念](进程与线程概念.md)
1112
* [Python中的多线程](Python中的多线程.md)
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# 命名空间与作用域
2+
## 命名空间(namespace)
3+
* **Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系。**
4+
* 一个变量名称可以定义在多个不同的命名空间下,之间互不影响
5+
* 同一个命名空间下不存在有两个相同的变量名
6+
* 顾名思义,namespace理解为为变量名称分组划分的空间区域
7+
8+
#### 一般有三种命名空间
9+
* 内置名称:built-in names,python内置的名称,如函数名abs,sum,异常名Exception等
10+
* 全局名称:global names, python模块中定义的名称,如模块中的类,函数,模块级别的变量与常量
11+
* 局部名称:local names, 函数中定义的名称,函数内部声明的变量名称
12+
13+
## 作用域
14+
**作用域是python程序可以直接访问的命名空间的文本区域。**
15+
* 在python程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,LEGB
16+
* L:local,当前函数内部作用域
17+
* E:Enclosing Functions,外部嵌套函数的作用域
18+
* G:global,全局作用域
19+
* B:built-in,python内建(内置模块)作用域
20+
21+
```python
22+
g_count = 0 # 全局作用域 G
23+
def outer():
24+
o_count = 1 # 闭包函数外的函数中 E
25+
def inner():
26+
i_count = 2 # 局部作用域 L
27+
```
28+
29+
#### 查看python的内置名称
30+
```python
31+
import builtins
32+
# dir():返回模块的属性列表
33+
print(dir(builtins))
34+
35+
['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', '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']
36+
37+
```
38+
39+
#### 内部作用域要修改外部作用域的变量,需要用到global,nonlocal
40+
具体参看[变量的作用域与闭包](变量的作用域.md)
41+
42+
* 函数内部修改全局变量,用global
43+
44+
```python
45+
def func():
46+
a = 99 # 此时a只是函数内部的定义局部变量,与全局变量a没有任何关系
47+
48+
if __name__ == '__main__':
49+
a = 1
50+
func()
51+
print(a) # 1
52+
```
53+
54+
```python
55+
def func():
56+
# 此时python在函数内部作用域中没找到对a的定义
57+
# 然后去全局空间找到了a
58+
print(a) # 1
59+
60+
if __name__ == '__main__':
61+
a = 1
62+
func()
63+
print(a) # 1
64+
```
65+
66+
```python
67+
def func():
68+
# 该代码无法编译通过
69+
# 此时认为a是函数内部的局部变量,但是在函数内部并没有找到对a的定义声明
70+
print(a)
71+
a = 99
72+
73+
if __name__ == '__main__':
74+
a = 1
75+
func()
76+
print(a)
77+
```
78+
79+
```python
80+
def func():
81+
# 声明a是引用的全局变量a,不是函数局部变量
82+
global a
83+
a = 99
84+
85+
if __name__ == '__main__':
86+
a = 1
87+
func()
88+
print(a) # 99
89+
```
90+
91+
* 嵌套函数内函数修改外函数中的变量,用 nonlocal
92+
93+
```python
94+
def out_():
95+
a = 1
96+
97+
def in_():
98+
nonlocal a
99+
a = 99
100+
101+
in_()
102+
print(a) # 99
103+
104+
if __name__ == '__main__':
105+
out_()
106+
```

python_basic/main.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@
2626
* [\_\_new__()与\_\_init__()方法](new和init方法.md)
2727
* [@property 保护变量的访问与设置](保护变量的访问与设置.md)
2828
* [Python函数参数的传递机制](Python函数参数的传递机制.md)
29-
* [猴子补丁 monkey patch](猴子补丁.md)
29+
* [Python猴子补丁 monkey patch](猴子补丁.md)

0 commit comments

Comments
 (0)