在Python中,每个函数都会创建一个作用域。Pythonistas也可能称函数拥有它们自己的命名空间(namespace)。这意味着当在函数体里遇到变量名
时,Python首先在该函数的命名空间中查找,Python包含了一些让我们查看命名空间的函数。让我们写一个简单的函数来探查一下local和global作用域
的区别。
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" def fool(): 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__': <_frozen_importlib_external.SourceFileLoader object at 0x10376a668>, '__spec__': None, '__annotations__': {}, '__builtins__':
"""
变量的生命周期啊
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
"""