一、Python执行流程
分析一下Python内部的执行原理
1 name = 'zhangsan' 2 def func(): 3 name = 'lisi' 4 age = 20 5 print('%s %d'%(name,age)) 6 7 func()
在python代码运行的时候,Python解释器会想系统申请一块内存,Python从上至下逐行翻译,遇到变量,会把变量和变量值的对应记录到内存中,遇到函数定义的时候,解释器只把函数名读入到内存,表示只当这个函数已经存在,至于函数内部的变量和逻辑,解释器根本不关心。
遇到函数调用,解释器会再开辟一块内存来存储这个函数里边的内容,这个时候才会关注函数里面的变量。函数内部的变量会被存储在新开辟的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存会被释放。
二、名称空间和作用域
2.1名称空间一共分为三种:
全局名称空间:每个py拥有自己的名称空间,他记录了变量,包括类、函数和其他调用的模块,上面程序中:name就位于全局名称空间
局部名称空间:每个函数拥有自己的名称空间,他记录了函数的变量,参数、局部定义的变量。上面程序中:func()函数中name和age位于局部名称空间
内置名称空间:Python内置的函数,任何模块都可以调用它,比如print() len() count()等
2.2名称空间的加载顺序和取值顺序:
加载顺序:
先加载内置名称空间(程序加载前)、其次是全局名称空间(程序运行中:从上至下),最后是局部名称空间(程序调用函数时,才会被加载)。
取值顺序:
局部名称空间,全局名称空间,最后是内置名称空间
程序在寻找变量时,从小范围,一层一层到大范围寻找。
name = 'zhangsan' def func(): name = 'lisi' age = 20 print('%s %d'%(name,age)) func()
从程序的打印可以看出,name 是 lisi。
三、作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。
局部作用域:局部名称空间,只在局部范围有效。
globals和locals方法

print(globals()) print(locals())

def func(): a = 12 b = 20 print(locals()) print(globals()) func()
global关键字,nonlocal关键字。
global:
1,声明一个全局变量。
2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
1 name = 'zhangsan' 2 def func(): 3 global name 4 name = 'lisi' 5 age = 20 6 func() 7 8 print(name) # name 就是 lisi
nonlocal:
1,不能修改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
四、函数的嵌套调用和作用链
4.1函数的嵌套调用
函数的嵌套调用
1 def max2(*args): 2 return args[0] if args[0] > args[1] else args[1] 3 def max4(*args): 4 ret = max2(args[0],args[1]) 5 ret1 = max2(ret,args[2]) 6 ret2 = max2(ret1,args[3]) 7 return ret2 8 9 ret = max4(23,-7,31,11) 10 print(ret)