python中使用闭包及修改外部函数的局部变量

python中使用闭包及修改外部函数的局部变量,第1张

在python中,函数可以被嵌套定义,也就是说,函数中可以定义函数。该函数还可以将其内部定义的函数作为返回值返回。

闭包的定义:一般来说,我们可以认为,如果一个函数可以读取其他函数中的局部变量,那么它们就构成了闭包。

注意 :闭包的定义不是特别清晰,但大体上的意思是这样的。

我们知道,普通的函数是可以使用全局变量的

类似的,函数中定义的函数,也是可以使用外部函数的变量的。因此,满足了函数读取了其他函数局部变量的这一条件,他们因此构成了闭包。

在闭包的使用中,我们可以先给外部的函数赋予不同的局部变量,然后再调用其中内部的函数时,就可以读取到这些不同的局部变量了。

外部变量的使用 在普通函数中,虽然可以直接使用全局变量,但是不可以直接修改全局变量。从变量的作用域来说,一旦你尝试修改全局变量,那么就会尝试创建并使用一个同名的局部变量。因此,如果你需要在普通函数中修改全局变量,需要使用global

同样的,如果你希望通过定义在内部的函数去修改其外部函数的变量,那么必须使用nonlocal

变量的引用

变量和数据都是保存在内存中的

变量和数据是分开存储的

数据保存在内存中某个位置,通过地址来标记

变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置

把变量保存数据地址的过程称为引用


变量的重新赋值修改的是变量中引用数据的内存地址

变量之间的赋值实际是引用的传递

函数参数的传递,本质也是引用的传递

函数的返回值本身也是引用的传递


可变和不可变类型

不可变类型,内存中的数据不允许被修改:数字类型(int,bool,float,complex,long(2,x)、字符串、元组(tuple)

可变类型,内存中的数据可以被修改:列表list、字典dict

无论是可变还是不可变数据类型,通过赋值语句,都会改变变量的引用


Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型


局部变量

1在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部)

2在函数外部无法直接访问局部变量

3不同的函数中可以定义同名的局部变量

4局部变量的生命周期:从定义变量时开始,到函数运行结束

全局变量

1在所有函数外边定义的变量就是全局变量

2让所有函数都能访问到,可以作为函数通信的桥梁

3一般情况下,为了和普通变量的区别,需要加上g_或gl_前缀

4全局变量一般放在所有函数的最上面

5在函数内部修改全局变量,必须要加上global关键字,如果不加global只是定义了一个同名的局部变量


函数的多个返回值

好像很难实现对变量X的任何改变都调用函数f(),调用的过程通常发生在对变量X的赋值和读取之时;如果变量赋值为某种结构类型,例如list,对list内元素的处理,无法引发调用
1、可以使用class的property属性实现
2、可以考虑使用yield语法实现
File file2py:
import file1
x = file1joinf()
xX = 90 或者 m = xX时都可以执行不同的程序
========================================
File file1py:
def ART(func):
return property(func())
class joinf():
def __init__(self):
self__X = None #真实保存变量的地方,不可直接访问
@ART
def X():
def fget(self): #执行m=xX时调用的函数
pass #可以在此执行任何指令和函数 - 可以在此调用函数f()
return self__X #不一定非要返回原值,此处返回什么,m得到的就是什么
def fset(self, value): #执行xX=90 *** 作时执行的函数,value就是90
pass #可以在此执行任何指令和函数 - 可以在此调用函数f()
self__X = value #不一定把原值付给self__X的,可以对value进行处理后再赋值给value
return locals()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13390359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存