函数作用域:
作用域作用的范围
1全局作用范围:就是全局作用域(内置名称空间与全局名称空间)
全局有效 全局存活
2 局部作用范围: 局部作用域(局部名称空间)
局部有效 临时存活
x=1
def f1():
def f2():
def f3():
print(len) # 都能找到 1 和len
print(x)
f3()
f2()
f1()
能访问到 len 叫全局有效 定义f1 内部就两行代码
如:
def f2():
f2()
其他代码就不考虑
f2 内部就是 def f2(): f2()两行代码
x=1
y=2
def f1():
def f2():
def f3():
x=3
y=5
print(x)
print(y) #输出 3 5 从内部 f3 开始找到xy
f3()
f2()
f1()
x=1
def f1():
def f2():
def f3():
x=222222
print(x)
x=2222222 # x=22222222 缩进写为什么报错 写法错误 不能写到print下面
f3()
f2()
f1()
def foo():
x=2
print(x)
foo()
x=1
def f1():
def f2():
def f3():
# x=2
print(x)
x=2222222 # 程序先从局部f3开始 找到x=2 注释掉后 在f2内找到x=222222
f3()
f2()
f1()
x=1
def f1():
def f2():
def f3():
zzz=333333
print(x) #在局部找到x=22222
x=222222
f3()
f2()
def bar():
# print(zzz) # 找不到 因为zzz=333是f1f2f3内的函数 所以报错
print(x) # 在全局名称找到 x=1
f1()
bar()
作用域关系是在函数定义阶段就固定死了 与函数的调用位置无关 但凡调用函数都需要到定义阶段找作用域关系
#
x=1
def f1():
print(x)
f1()
x=11111111
def f2():
print(f1)
x=22 # 调用f2 找到f1和f2内部的x=22 没有关系
f1()
f2()
调f2()找到f1()和f2内部的x=22没有关系、到f1内部找到x=111111111因为当你调用f2时x已经被攥改写成
11111111如果注释掉下面的f1() 那么x=1
输出
# 1
<function f1 at 0x000001DAA0E8A7B8>
11111111
补充知识点
1、、、函数对象加作用域的结合
def f1():
def inner():
print('from inner')
# return inner # 不加return 报错 return 能返回给全局当中
f=f1()
print(f) # <function f1.<locals>.inner at 0x000001D8994BA730>
f()
输出
from inner
def f1():
def inner():
print('from inner')
return inner
f=f1()
def der():
f()
der()
输出from inner
der()调用 找到 f 在找到f1 在找到inner return 到全局 输出 from inner
def f1():
x=1
def inner():
print('from inner',x)
return inner
f=f1()
def bar():
x=1111111111111111
f()
bar()
输出 from inner 1 因为调用里的x=1111111不好使
x=1
def foo():
x=2
foo()
print(x)
输出1 因为print 是在全局的打印 所以 x=2是局部的名称空间 所以访问不到 只能访问造全局的x=1
我想在局部里改全局的x=1 改成2呢 用global
x=1
def foo():
global x
x=2
foo()
print(x)
x=1
def f1():
def f2():
def f3():
global x
x=1111111111
f3()
f2()
f1()
print(x) # 因为是改全局的变量所以print 写在全局上
nonlocal 是改 局部里的
x=1
def f1():
def f2():
x=2222222222
def f3():
nonlocal x
x=1111111111 #把x=222222 改成 111111
f3()
print(x)
f2()
f1()
不可变类型:
x=1
def f1():
x=222
f1()
print(x)
改不了 只能用global声明
x=1
def f1():
global x
x=222
f1()
print(x)
可变类型
x=[]
def f1():
x.append(1) # 一个列表把1这个值放在全局x=[]里
f1()
print(x)