一:python作用域基础
作用域就是指命名空间,python创建、改变或查找变量名都是在所谓的命名空间中。变量在赋值创建时,python中代码赋值的地方决定了这个变量存在于哪个命名空间,也就是他的可见范围。
对于函数,函数为程序增加一个额外的命名空间层来最小化相同变量之间的冲突:默认情况下,一个函数内赋值的所有变量名都与该函数的命名空间相互关联。这条规则意味着:
- 在def内赋值的变量名只能被def内的代码使用。不能在函数的外部引用该变量名。
- 在def内赋值的变量名与在def外赋值的变量名并不冲突,即使是相同的变量名,也完全时两个完全不同的变量。
- 如果一个变量在def内赋值,它对于该函数时局部的
- 如果一个变量在外层的def中赋值,它对于内层的函数时非局部的
- 如果一个变量在所有的def外赋值,它对整个文件来说时全局的。
可见,一个变量的作用域取决于它在代码中被赋值的位置,而与函数调用完全无关
作用域细节
函数的命名空间时可嵌套的,以便函数内部用的变量名不会与函数外(同一模块或另一函数中)的变量名冲突。函数定义了局部作用域,而模块定义了全局作用域:
- 外围模块是全局作用域。这里的全局指的是文件顶层的变量名对于这个文件是全局的,全局作用域的作用范围仅限于单个文件。python中不存在一个跨文件的单一且无所不包的全局作用域的概念,全局是对模块而言的。
- 赋值的变量名除非被声明为global或nonlocal,否则均为局部变量。在函数内部想更改顶层变量的值,就不许声明为全局变量。
- 函数的每次调用就会创建一个新的局部作用域。可以认为每一个def及lambda语句都定义了一个新的局部作