ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python 函数和变量作用域 [打印本页]

作者: 不到断气不罢休    时间: 2024-5-18 03:55
标题: Python 函数和变量作用域
变量引用次序

Python 引用变量的次序:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->ython内置变量。
1、 global

global 关键字用来在函数或其他局部作用域中使用全局变量,如果不对全局变量进行修改,那么可以不使用global关键字;如果想要在函数或局部作用域中对全局变量进行修改操作,那么必须在函数或局部作用域中使用global关键字进行声明,否则报错:UnboundLocalError
  1. count = 1
  2. def foo():
  3.   global count  #如果不加这个那么就会报错
  4.   count += 1
  5.   print(count)
  6. foo()
复制代码
2、 nonlocal

使用情况:闭包,嵌套函数中
如果内部函数想要对外部函数的局部变量进行修改时,需要在内部函数中声明:
  1. nonlocal <变量名>
复制代码
nonlocal语句会搜刮当前调用栈中的下一层函数的定义。
  1. def a():  count = 1  def b():    nonlocal <变量名>count    count += 1    print(count)  return ba()()
复制代码
  
3、 装饰器

介绍:装饰器的作用是将被修饰的函数当作参数传递给与装饰器对应的函数,并返回包装后的被装饰的函数。装饰器实在是闭包的一种特别情况
  1. def a(func):
  2.   return func
  3. @a
  4. def b():
  5.   pass
  6. b()
复制代码
  
执行示意图:

解析过程:
发现@a,那么就将会执行a(b),返回b
b(),这一步调用的实在是a返回的同一名的b函数,而且开始执行b函数中的操作
4、 闭包

闭包概念:在盘算机科学中,闭包(Closure)是词法闭包的简称,是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不破例。
简朴介绍:可以理解为一个封闭的包裹,这个包裹就是一个函数和函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以随着包裹到处游荡,比如:装饰器是一个闭包,随着装饰器进行传递的函数名就是自由变量(函数),装饰器和内部逻辑结构就是闭包中的函数和内部逻辑。
  1. def func(name):
  2.   def inner_func(age):
  3.     print(‘name:’+name+’ age:’+age)
  4.   return inner_func
  5. a = func(‘liyang’)
  6. a(20)   #>>> name:liyang age:20
复制代码
  
上面的例子中:调用func函数时就产生了闭包inner_func,该闭包所持有的自由变量是name。
当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。
5、 延迟绑定

Python函数的作用域是由代码决定的,也就是静态的,但是使用是动态的,是在执行时确定的
闭包中遇到的问题
  1. fs = [lambda x: x*I for i in range(4)]
  2. print(fs[0](1))     #>>> 3
复制代码
期望输出结果是:0,但是结果却是:3
这是因为只有在函数foo被执行的时候才会搜刮变量i的值,由于循环已结束,i指向终极值3,所以终极会发现结果都是一样。
使用下面的闭包方式,就会得到期望的结果:
  1. def foo(i):
  2.   return lambad x: x*i
  3. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
  4. fs = [foo(i) for i in range(4)]
  5. print(fs[0](1))
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4