变量的引用
变量和数据都是保存在内存中的
变量和数据是分开存储的
数据保存在内存中某个位置,通过地址来标记
变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置
把变量保存数据地址的过程称为引用
变量的重新赋值修改的是变量中引用数据的内存地址
变量之间的赋值实际是引用的传递
函数参数的传递,本质也是引用的传递
函数的返回值本身也是引用的传递
可变和不可变类型
可变类型,内存中的数据可以被修改:列表list、字典dict
无论是可变还是不可变数据类型,通过赋值语句,都会改变变量的引用
Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型
局部变量
①在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部)
全局变量
①在所有函数外边定义的变量就是全局变量
函数的多个返回值
(1)简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,如有全局同名变量,其值不变.
*<
在python中,函数可以被嵌套定义,也就是说,函数中可以定义函数.该函数还可以将其内部定义的函数作为返回值返回.
闭包的定义:一般来说,我们可以认为,如果一个函数可以读取其他函数中的局部变量,那么它们就构成了闭包.
注意 :闭包的定义不是特别清晰,但大体上的意思是这样的.
我们知道,普通的函数是可以使用全局变量的
类似的,函数中定义的函数,也是可以使用外部函数的变量的.所以呢,满足了函数读取了其他函数局部变量的这一条件,他们所以呢构成了闭包.
在闭包的使用中,我们可以先给外部的函数赋予不同的局部变量,然后再调用其中内部的函数时,就可以读取到这些不同的局部变量了.
外部变量的使用 在普通函数中,虽然可以直接使用全局变量,但是不可以直接修改全局变量.从变量的作用域来说,一旦你尝试修改全局变量,那么就会尝试创建并使用一个同名的局部变量.所以呢,如果你需要在普通函数中修改全局变量,需要使用global
同样的,如果你希望通过定义在内部的函数去修改其外部函数的变量,那么必须使用nonlocal
嵌套函数在执行时(而不是在定义时)从父范围中查找变量.
编译函数主体,然后验证"自由"变量(未在函数本身中通过赋值定义),然后将其作为闭包单元绑定到函数,并且代码使用索引引用每个单元格.pet_function所以呢具有一个自由变量(cage),然后将其通过一个闭合单元引用,索引为0的闭合本身指向局部变量cage在get_petters功能.
当你实际调用该函数时,该闭包将用于在你调用该函数时查看cage周围作用域中的值.问题就今天这一节.在你调用函数时,该函数已经完成了对其结果的计算.将在在执行过程中的一些点局部变量分配各的,和字符串,但在功能的结束,包含了最后一个值.所以呢,当你调用每个动态返回的函数时,就会得到打印的值.get_petterscage'cow''dog''cat'cage'cat''cat'
解决方法是不依赖闭包.你可以改用部分函数,创建新的函数作用域或将变量绑定为关键字parameter的默认值.
部分函数示例,使用functools.partial():
from functools import partialdef pet_function(cage=None):
print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
创建一个新的范围示例:
def scoped_cage(cage=None):
def pet_function():
print "Mary pets the " + cage.animal + "."
return pet_functionyield (animal, partial(gotimes, scoped_cage(cage)))
将变量绑定为关键字参数的默认值:
def pet_function(cage=cage):
print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, pet_function))
无需scoped_cage在循环中定义函数,编译仅进行一次,而不是在循环的每次迭代中进行.
以上就是土嘎嘎小编为大家整理的python局部函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!