Discuss / Python / 我擦,要疯了!!

我擦,要疯了!!

Topic source

Mayday阿立

#1 Created at ... [Delete] [Delete and Lock User]

课程看了半天,一点都不明白!什么意思,好抽象啊!看大佬在下边说的也是不懂啊!

dfj多多

#2 Created at ... [Delete] [Delete and Lock User]

如果你说的是最后的练习问题的话我可以跟你解释一下。

因为python中一切皆是对象,我们平时使用的a=1,s=‘adada’这些‘赋值’语句实际上是在内存中开辟了一块空间存储了1和‘adada’这两个对象(包括其属性和方法)后将内存空间的地址赋值给了a和s(为了方便,我们称呼它们为引用)。而在之后使用a和s时其实就是根据内存空间找到对应对象,调用其中存储的内容

既然如此,一个方法也可以单独存放在内存空间内作为一个对象被引用。而这就是高阶函数和返回函数讨论的问题。

高阶函数是将方法作为参数传入其他方法中去使用,比如sorted中的key参数,map、reduce中的函数参数

而返回函数则是将方法(为了方便称呼,我们叫它内函数)作为一个方法(外函数)的返回值

根据C语言基础我们可以知道当一个方法调用return时,会释放掉其内存(准确的说是函数栈)空间,则该函数的局部变量(包括函数体内定义和传入的参数)都会被释放而无法正常访问。但是假如我们的内函数需要使用外函数的局部变量,那就需要把内函数使用的局部变量‘绑定’给内函数,从而在外函数被释放的前提下内函数的使用也不会受到影响。楼下有一层总结了四种方法,其中方法四就是利用了这一点,因为生成器被内函数使用绑定,所以外函数释放后也无所谓。

但是,生成器占据的资源相较于1个数据肯定要大,而我们又想节约资源实现计数该怎么办?---我们需要修改外函数的局部变量

重点来了!!!!!!

试想外部有语句 a = 0

内部有语句 a = a +1

python不像c语言有定义语句,我怎么知道内部的语句究竟是赋值外部变量还是定义内部变量??????

(ps:c语言的情况下,外部int a=0,内部若是int a =1则覆盖外部,若是修改外部则直接赋值语句a=a+1.所以不存在歧义)

为了解决这个问题,存在nonlocal关键字,nonlocal标记的赋值语句代表我这是赋值外部(第一层外部),没有标记的代表定义内部变量(这是方法3)

而假如我们定义了多层,func1包含func2,fun2包含func3,func 3想修改 func1的变量,(nonlocal标记的赋值语句指的是func2中的变量修改,因此没用)。所以我们想出了一个办法,创建一个全局标记global,凡是被global声明的变量就是指在内存空间内有独立空间的变量,没有被声明的就是局部的,从而解决跨层修改变量的问题(这是方法2)

最后谈谈方法一(使用列表),列表的实现是可变长度的数组(详见https://www.jb51.net/article/164319.htm

我觉得能用这种方法应该是因为列表的定义L=[0]和列表的赋值L[x]=y语句不同,所以不存在歧义的才可以如此使用。感觉和所谓的列表实现类似C语言数组(指针)所以能够无视作用域没有关系(在python面向对象来看,所有的引用其实都是指向内存区域的指针,但不是所有类型的引用都可以无视作用域)


  • 1

Reply