写在前边
最近频繁遇到变量赋值问题,这里整理下。请大家不吝赐教。
变量分类
变量类型 | 定义 | 变量作用域 | 存活时间 | 说明 |
局部变量 | 在函数内部定义,只能在此变量被声明的函数内访问 | 局部作用域:在被调用函数内赋值的变元和变量 | 函数调用至函数返回 | 局部作用域声明 或 修改全局变量 global 内层函数修改外层变量 nonlocal,同时,nonlocal 不能定义,不能修改全局变量 |
全局变量 | 在函数外定义,可以在函数内外被访问 | 全局作用域:在所有函数之外赋值的变量 | 定义全局变量用 global | |
-----------下边是涉及到类的---------------- | ||||
类变量 | 在类下定义,这里类似java的static,所有实例之间共享数据,归属于一个类 | 可以用类调用,可以用实例对象调用 | 可变变量时(如列表、字典、自定义类)传引用,不可变变量时(如int、string)传值 | |
对象变量、实例变量、成员变量 | 在类的构造函数(__init__)内以self.开头来定义,特定于每个实例的数据,不与类其他实例共享,每个实例变量正对特定实例单独存储一份 | 类变量可以被同名的实例变量”遮盖“ | ||
局部变量 | self.给出,不在构造函数中进行初始化 |
区分一个变量是否处于局部作用域
- 如果变量在全局作用域中使用,它就总是全局变量
- 如果在一个函数中,有针对性该变量的global语句,它就是全局变量
- 否则,如果该变量用于函数中的赋值语句中,它就是局部变量
- 但是,如果该变量没有用在赋值语句中,它就是全局变量
Python查找变量的顺序
Python查找变量时,会按照 局部命名空间(如果存在嵌套就逐层向外)、全局命名空间、内置命名空间的顺序来。
在未赋值前引用,会报 "local variable 'xxx' referenced before assignment"
找不到,会报 "name 'xxx' is not defined"
其他要注意的点
-
数字 字符串 元组 修改全局变量时需要加global,列表和字典则不需要。
-
其实局部变量是有层次的,如果出现函数的嵌套,内层函数想调用外层的变量是,是不能用global声明的,因为外层的变量不叫全局变量。这时候如果想修改外层的变量,就得用到一个新的关键字:nonlocal
参考
https://blog.csdn.net/qq_44198436/article/details/100051651