在讲Python作用域前,先来分析一下如下一个函数:
def multiplier(factor):
def multiplyByFactor(number):
return number * factor
return multiplyByFactor
当我们执行
test=multiplier(10)的时候返回的并不是一个具体值而是如下这么一个函数:
.multiplyByFactor at 0x00000212A7B27400>
实际上这里我们可以看出执行这个函数之后返回的是一个函数,当我们再次执行 test(10)的时候 结果就是100
这里我们可以看做和js一样是返回式函数。好了,打住。先讲一下python作用域吧。
一:Python作用域是一种包含关系
class Common:
a=10
def __init__(self,name,*param):
self.name=name
self.age=param[0]
self.birth=param[1]
def GetName(self):
name='noname'
return name
c=Common("ck",10,"1989-02-28")
print(c.GetName())
print(c.name)
print(c.birth)
result:
noname
ck
1989-02-28
当我们生成一个类的时候,打个比方这时你进入了一个大房子里面。大房子里面你能看到的家俱房间都是这个类里面的东西。
当你不进入关着门的小房间时,你可以随意使用这个类里面的东西。这些东西我们称作类的属性变量,所有的类的属性变量都在一个self的字典里面存着
当然我们可以想以前那样直接在内部进行变量赋值而不用self,但是这样最终都会绑定到self关键字上面,这里我们可以理解他为this指针
这个时候当我们进入一个小房间(内部函数),操作了一个叫name的内部数据时,房间外面还有一个叫name的同样的数据,
但是我在内部操作不会影响到外部房间的,因为我们是隔离的,我们有房间保护不会搞混(作用域),这个name就是内部的私有变量
当我们需要调用外部变量时需要使用self.name,这个时候我们就是用的整个类的全局数据。相当于所有房间都可以使用的东西,比如钥匙。
因此可以得出:
packgae->class->function,在包里面定义的变量在class,function里面可以调用,在class里面定义的变量function可以调用,function里面的变量是私有的
二:作用域纽带
如果两个function需要信息沟通如何处理呢,这就需要他们之间有一个纽带,比如引用变量。
引用变量:类,数组,元组,复杂结构数据等
参数变量:字符,数字等
传入函数的引用变量如果在函数内部被改变了,name在外部作用域的变量值也会随之改变,参数也就不会隔离,而起到作用域之间沟通的一个桥梁
而值变量,用外作用域的值变量传入函数,在函数内部改变不会改变外部作用域的值变量,这就起到了参数隔离。
最后回到我们最开始的一个例子
第一次调用函数:test=multiplier(10)这个时候在内存中实际上已经建立了一个作用域,外层作用域变量factory已经赋值为10,当调用test(10)的时候其中里面的参数可以直接访问factory,因此result为100
因此对于function内部的function来说外部function的变量内部Function可以访问,反之内部function变量外部function不可访问
tips:有时候我们希望传入一个引用变量又不想改变他的值,那么这个时候我们可能需要用到克隆或者切片