一入python情似海,从此妹纸是路人(六)

时间:2022-07-21 00:58:19

一、作用域

变量的查找顺序: 局部 ---- 全局 ---- 内置

a = 1

局部变量---- 函数的内部去使用的
全局变量----整个py文件里都能使用的


1.局部变量(在函数内):只能在局部使用(在函数内部使用)

def funa():
a = 1
print('第一次的值:%s' % a)
a = 2
print('第二次的值:%s' % a)
funa()
print(a)

一入python情似海,从此妹纸是路人(六)

2.全局变量: 在函数外

a = 100       # 全局变量
print(id(a))
def funa():
a = 200 # 只是和全局变量同名的局部变量 ----系统默认
print(a)
print(id(a))
funa()
print(a)

一入python情似海,从此妹纸是路人(六)


3. global : 声明这个变量为全局变量;

应用场景:在函数内部,想去修改全局变量的值时

a = 100       # 全局变量
def funa():
global a # 声明a为全局变量
a = 200
print(a)
funa()
print(a)

一入python情似海,从此妹纸是路人(六)

拓展

可变对象:内容可以改变,但是地址不变 ----- 可以不声明

lst = [1, 2, 3, 4, 5]  # 全局变量
def func():
lst[0] = 188
print(lst)
func()

一入python情似海,从此妹纸是路人(六)


4.nonlocal:用来声明外层的局部变量----修改局部变量

在函数嵌套里

a = 10
def funa():
a = 1 # 局部变量
def funb():
nonlocal a # 声明a是外层的局部变量a
print(a) # -- 全局变量
a = 2 # ----局部变量
funb()
funa()
print(a)

一入python情似海,从此妹纸是路人(六)

二、闭包

num = 1
def fun(step):
global num
num += step
print(num)
fun(3) # 4
fun(3) # 7
fun(3) # 10

一入python情似海,从此妹纸是路人(六)

结论:每一次调用,num保存了上一次调用的结果


def fun(step):
num = 1
num += step
print(num)
fun(3)
fun(3)
fun(3)

一入python情似海,从此妹纸是路人(六)

局部变量被销毁了


--- 要保存局部变量,怎么办?----

闭包:能保存局部变量的值


闭包的三个条件,缺一不可

  • 1) 函数中嵌套一个函数;
  • 2) 内层嵌套函数,对外部作用域有一个非全局变量的引用;
  • 3) 外层函数返回值是内层函数的函数名


函数的嵌套

def outer():
n = 10
def inner():
n = 20
print('inner:',n)
print('outer:',n)
inner()
outer()

一入python情似海,从此妹纸是路人(六)

闭包

def outer(m):
n = 10
def inner():
print(n+m)
return inner
t = outer(2) # 相当于 t = outer(2) = inner
t() # inner()
outer(3)()

一入python情似海,从此妹纸是路人(六)

def outer(a):
def inner():
nonlocal a
a += 1
print(a)
return inner
outer(2)()

一入python情似海,从此妹纸是路人(六)


三、拆包

1.元组的拆包

t1 = (1, 2, 3)
i, j, k = t1
print(i)
print(j)
print(k)

一入python情似海,从此妹纸是路人(六)

print(*t1)  # ---直接去掉外壳
t1 = (1, 2, 3)
i,*j = t1
print(i)
print(j) # [2, 3]

一入python情似海,从此妹纸是路人(六)

列表拆包
lst = [1,2,3]
print(*lst)

一入python情似海,从此妹纸是路人(六)