1、引子
a = 1
def func():
print(a)
func()
函数func中,可以使用函数外的变量a,这就涉及到命名空间和作用域。
2、命名空间
命名空间分三种
1、内置命名空间 —— python解释器
内置命名空间在python一启动的时候就可以使用
内置的名字,启动解释器的时候,就加载进内存里
2、全局命名空间 —— 自己写得代码但不是函数中的代码
从下到下执行代码的时候加载进内存
存放了设置的变量名和函数名
3、内置命名空间 —— 函数
函数内部定义的名字
当函数调用时,才产生这个命名空间,随之函数的执行结束,这个命名空间也就消失
在局部:可以使用全局和内置命名空间的名字
在全局:可以使用内置命名空间中的名字,但是不能用局部命名空间的
在内置:不能使用全局和局部命名空间中的名字
def max(l):
print("in max func")
print(max([1,2,3,4]))
执行结果

正常情况下,我们可以直接使用内置的名字
但是,如果在全局定义了和内置名字一样的名字是,会使用全局的名字
多个函数,拥有多个独立的局部命名空间,不共享
3、函数的调用和地址
def input():
print("in input now!")
def func():
print(input) # 打印的结果为函数的地址,并不会执行函数
func()
func → 不加括号,获取的是函数的地址
函数名()→ 调用函数
函数的内存地址()→ 调用函数
4、作用域
全局作用域 —— 作用全局 —— 内置和全局命名空间中的名字都属于全局作用域 —— gloabs()
局部作用域 —— 作用局部 —— 函数(局部命名空间中的名字属于局部作用域) —— locals()
# 在全局作用域,globals和locals一样
print(globals())
print(locals())
# 在局部作用域,globals显示全局作用域的名字,locals只显示局部作用域的名字
def func():
a = 1
b = 2
print(globals())
print(locals())
func()
对于全局作用域的不可变数据类型的变量,在局部作用域不可变。
如果需要修改,需要使用global参数申明
a = 1
def func1():
a += 1 # 更改全局的变量,报错local variable 'a' referenced before assignment
func1()
a = 1
def func1():
global a
a += 1 # 更改全局的变量,由于申明了global a程序可以执行
func1()
print(a) # 因为申明了global,变量改变
使用global参数,更改变量的值,存在危险性。
不看函数代码时,无法知道变量是否改变。
因此,在改变全局域变量时,采取传值——返回值的方式进行
a = 1
def func(a):
a = 2
return a
a = func(a)
print(a)