# Python3 命名空间和作用域
# 一般有三种命名空间:内置名称 全局名称 局部名称
# 内置名称:Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等
# 全局名称:模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量
# 局部名称:函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
# 命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束
# 作用域就是一个 Python 程序可以直接访问命名空间的正文区域
# Python的作用域一共有4种,分别是:
# L(Local):最内层,包含局部变量,比如一个函数/方法内部
# E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量
# G(Global):当前脚本的最外层,比如当前模块的全局变量
# B(Built-in): 包含了内建的变量/关键字等
# Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
if True:
msg = '你真好,真是个大SD'
print(msg) # 这里能够输出,说明在诸如if语句里面定义的变量是可以直接在外部访问
# 全局变量和局部变量
total = 0
def sum(a,b):
total = a+b
print("在里面是局部变量,total = ",total)
return total
sum(10,20)
print("在外面是全局变量,total = ",total)
# global 和 nonlocal关键字
# 内部作用域修改外部作用域的变量 需要用到这两个关键字
# 修改全局变量:
num = 1
def fun1():
global num
print(num)
num = 123
print(num) # 外部参数num发生了变化
fun1()
print(num)
# 修改嵌套作用域
def outer():
num = 1
def inner():
nonlocal num
num = 100
print(num)
inner()
print(num)
outer()
# 特殊情况
a = 10
def test():
global a
a = a+1
print(a)
test()
print(a) # 外部的值的发生了改变
# 或者使用参数传递的方式:
a = 10
def test(a):
a = a+1
print(a)
test(a)
print(a) # 实际上外部的值没有改变