Python 函数和变量作用域

这篇具有很好参考价值的文章主要介绍了Python 函数和变量作用域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

变量引用顺序

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

1、 global

global 关键字用来在函数或其他局部作用域中使用全局变量,如果不对全局变量进行修改,那么可以不使用global关键字;如果想要在函数或局部作用域中对全局变量进行修改操作,那么必须在函数或局部作用域中使用global关键字进行声明,否则报错:UnboundLocalError

count = 1
def foo():
  global count  #如果不加这个那么就会报错
  count += 1
  print(count)
foo()

2、 nonlocal

使用情况:闭包,嵌套函数中

如果内部函数想要对外部函数的局部变量进行修改时,需要在内部函数中声明:

nonlocal <变量名>

nonlocal语句会搜索当前调用栈中的下一层函数的定义。

def a():
  count = 1
  def b():
    nonlocal count
    count += 1
    print(count)
  return b
a()()

  

3、 装饰器

介绍:装饰器的作用是将被修饰的函数当作参数传递给与装饰器对应的函数,并返回包装后的被装饰的函数。装饰器其实是闭包的一种特殊情况

 def a(func):
  return func
 
@a
def b():
  pass
b()

  

执行示意图:
Python 函数和变量作用域
解析过程:

发现@a,那么就将会执行a(b),返回b
b(),这一步调用的其实是a返回的同一名的b函数,并且开始执行b函数中的操作

4、 闭包

闭包概念:在计算机科学中,闭包(Closure)是词法闭包的简称,是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

简单介绍:可以理解为一个封闭的包裹,这个包裹就是一个函数和函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以随着包裹到处游荡,比如:装饰器是一个闭包,随着装饰器进行传递的函数名就是自由变量(函数),装饰器和内部逻辑结构就是闭包中的函数和内部逻辑。

def func(name):
  def inner_func(age):
    print(‘name:’+name+’ age:’+age)
  return inner_func
 
a = func(‘liyang’)
a(20)   #>>> name:liyang age:20

  

上面的例子中:调用func函数时就产生了闭包inner_func,该闭包所持有的自由变量是name。

当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。

5、 延迟绑定

Python函数的作用域是由代码决定的,也就是静态的,但是使用是动态的,是在执行时确定的

闭包中遇到的问题

fs = [lambda x: x*I for i in range(4)]
print(fs[0](1))     #>>> 3

期望输出结果是:0,但是结果却是:3

这是因为只有在函数foo被执行的时候才会搜索变量i的值,由于循环已结束,i指向最终值3,所以最终会发现结果都是一样。

使用下面的闭包方式,就会得到期望的结果:文章来源地址https://www.toymoban.com/news/detail-856731.html

def foo(i):
  return lambad x: x*i
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845 
fs = [foo(i) for i in range(4)]
print(fs[0](1))

到了这里,关于Python 函数和变量作用域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python基础】—函数def()的定义与调用、参数、return返回值及变量作用域

    语法: 举例: 上面我们定义一个名字为hello的函数,括号内部是函数接收的参数name,紧接着就是函数的功能代码。 多次调用 位置参数 这里的\\\"手拍黄瓜\\\"和\\\"大米饭\\\"是对应参数appetizer和course的位置顺序传递的,所以被叫作位置参数,这也是最常见的参数类型。 默认参数 注意

    2024年02月02日
    浏览(39)
  • 【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

    \\\" 引用 \\\" 语法 是 C++ 语言中 特有的 , 在 C 语言中是没有 引用 这个概念的 ; 分析 引用 之前 , 先回顾下 变量 : 在 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 ) 博客中 , 介绍了变量的本质 : 变量 的本质是 内存空间 的 \\\" 别名

    2024年02月11日
    浏览(48)
  • C++的引用变量作为函数参数

    在C++的中新增一个特性:按引用传递变量,虽然与按传递变量的地址可以实现相同的结果,但引用有其独特的地方。 引用传递: 引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。 通过引用变量用作参数,函数将使用原始数据,而不是其副本。 举

    2023年04月14日
    浏览(35)
  • JavaScript 函数、函数构造、函数调用、参数、函数返回值、变量的作用域、预解析

    一、函数及函数的构造 函数是一个可重用的代码块,用来完成某个特定功能。每当需要反复执行一段代码时,可以利用函数来避免重复书写相同代码。 函数包含着的代码只能在函数被调用时才会执行,就可以避免页面载入时执行该脚本 简单来说就是一个封装,封装的是一个特

    2024年02月06日
    浏览(65)
  • python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

    目录 python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域 1、先来看个问题吧: 2、引用 VS 拷贝: 3、增强赋值以及共享引用:

    2024年02月08日
    浏览(46)
  • Python 变量?对象?引用?赋值?一个例子解释清楚

    哈喽大家好,我是咸鱼。 前天有个小伙伴找到我,给了我一段 python 代码: 然后问我为什么结果是 [1, [...]] ,我一看这个问题有意思,我说三言两语解释不清楚,我写篇文章到时候你看下吧,于是有了今天这篇文章。 在正式开始之前,让我们先弄清楚一些概念。 \\\"Python 中一

    2024年01月24日
    浏览(44)
  • Python中的变量作用域

    问题: 简述以下Python中的变量作用域(变量查找顺序) 变量的作用域:变量的有效使用范围 变量的作用域由变量的定义位置决定  Python变量作用域分4种情况: L:Local, 局部作用域 ,即在函数中定义的变量; E:Enclosed, 嵌套作用域 ,可理解为嵌套的父级函数的局部作用域,

    2024年02月13日
    浏览(35)
  • Python变量的作用域教程

    在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。 看这样一段代码: 输出: 变量 x 在函数内部被重新赋值。但在调用了函数之后,x 的值仍然是50。为什么? 这就得说一下变量的“作用域

    2024年02月08日
    浏览(40)
  • python引用from的变量报错Unresolved reference ‘xxxx‘

    我这里是一个文件中集中定义了常量,然后使用from xxxx import xxxx引入 然后发现执行报错: 而且在class中只有这一个def中的xxxx.常量会报错。并且其他def中引用都正常,手打时,pycharm提示也正常。 原因是我在def中for循环中写的是 这里与from重复了导致的报错 如果不是,那就检

    2024年02月10日
    浏览(34)
  • Python变量:创建、类型、命名规则和作用域详解

    变量是用于存储数据值的容器。 创建变量 Python没有用于声明变量的命令。 变量在您第一次为其分配值时被创建。 示例 变量不需要声明为特定类型,并且甚至在设置后可以更改类型。 示例 如果要指定变量的数据类型,可以使用类型转换。 示例 获取类型 您可以使用type()函数

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包