在Python中,每个函数都会创建一个作用域。Pythonistas也可能称函数拥有它们自己的命名空间(namespace)。这意味着当在函数体里遇到变量名
时,Python首先在该函数的命名空间中查找,Python包含了一些让我们查看命名空间的函数。让我们写一个简单的函数来探查一下local和global作用域
的区别。
Python
# -*- coding: utf-8 -*-
"""
@Time: 2018/1/25
@Author: songhao
@微信公众号: zeropython
@File: namspace.py
"""
a = "This is a global variable"
def fool():
print(locals(),"局部变量")
fool()
print(globals(), "全局变量")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
"""
@Time: 2018/1/25
@Author: songhao
@微信公众号: zeropython
@File: namspace.py
"""
a="This is a global variable"
deffool():
print(locals(),"局部变量")
fool()
print(globals(),"全局变量")
输出结果是:
读取 全局作用域:
"""
如果要修改 必须 global a
如果只是简单的读取可以 直接读取
"""
"""
# 修改全局变量
def fool():
print(a)
a = "new a"
print(locals(),"局部变量")
fool()
print(globals(), "全局变量")
# output
Traceback (most recent call last):
File "/Users/songhao/py/TouTiaoShare/装饰器/namspace.py", line 32, in fool()
File "/Users/songhao/py/TouTiaoShare/装饰器/namspace.py", line 28, in fool
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
"""
"""
# 添加global,就可以修改了
def fool():
global a
a = "new_a"
print(a)
print(locals(),"局部变量")
fool()
print(globals(), "全局变量")
"""
# {} 局部变量 因为a不属于 局部变量
# {'__name__': '__main__', '__doc__': '\n@Time: 2018/1/25\n@Author: songhao\n@微信公众号: zeropython\n@File: namspace.py\n', '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/songhao/py/TouTiaoShare/装饰器/namspace.py', '__cached__': None, 'a': 'new_a', 'fool': } 全局变量
"""
变量的生命周期啊
def fool():
x = 1
global x
fool()
print(x)
File "/Users/songhao/py/TouTiaoShare/装饰器/namspace.py", line 62
global x
^
SyntaxError: name 'x' is assigned to before global declaration
"""