1、python代码运行遇到函数时 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。 等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。 2、命名空间
3、作用域 全局作用域:内置命名空间和全局命名空间中的名字都属于全局作用域 局部作用域:函数(局部命名空间中的名字属于局部作用域) #查看局部作用域中的名字 locals() #查看全局作用域中的名字 globals() 4、global 对于不可变数据类型,局部中可以获得其值,但是不能修改 如果要修改,可以通过global关键字 a = 1 b = 2 def func(): global a a = 6 #合法 b = 4 #不合法操作 5、函数嵌套 def outer(): def inner(): print('---') inner() outer() 6、nonlocal 在嵌套的函数中,如果我们要修改上层函数的变量,通过上面global是做不到的,因为global获取的是全局中的那个变量,所以可以通过nonlocal来获取(只能获取最接近的那层,也就是上一层中的变量) a = 1 def outer1(): a = 2 def outer2(): a = 3 def inner(): nonlocal a a = 5 inner() outer2() outer1() #outer2中的a = 3将变成a = 5 7、函数名的本质是内存地址,可以作为容器元素,返回值,参数 #函数名可以赋值 def func(): print('I am func') func2 = func func2() #实际上执行的是func #函数名可以作为容器的元素 l = [func,fun2] for f in l: f() #函数名可以作为返回值 def ohyeah(f): f() return f 8、闭包 闭包就是内层函数调用外层函数的变量 def outer(): a = 1 def inner(): print(a) #如果是闭包,调用__closure__将返回cell def outer(): a = 1 def inner(): print(a) print(inner.__closure__) outer() #闭包的用法就是在函数外部使用其内部的函数。 #可以使外部函数的变量无需重复创建 def outer(): a = 1 def inner(): print(a) return inner out = outer() out() out() 9、三目运算符 def max(a,b): return a if a>b else b 来源:http://www./content-1-114301.html |
|