深度实践OpenStack:基于Python的OpenStack组件开发—3.5.7 变量作用域
3.5.7 变量作用域
在讲解变量的时候,提到了两个概念:全局变量和局部变量,下面介绍这两种变量之间的区别。先看下面的代码:
operation = ["add","sub"]
def get_operation():
operation = {"lucifer":10000}
return operation
暂时忽略这段代码的命名是否规范,先看一下这段代码的返回值,返回的是字典形式的operation还是列表形式的operation?为了回答这个问题,先讲解一下Python的变量搜索顺序。在Python中搜索变量时,总是local>file>global,即优先搜索局部变量,其次是在本文件中定义的全局变量,最后才是整个工程中的全局变量。如果这三种变量同时出现,默认优先使用局部变量,当查找不到局部变量时,再依次查找文件中的全局变量和工程中的全局变量。值得注意的是,由于可读性和可维护性,一般来说,在代码中禁止使用工程级别的全局变量。所以,上边一段代码返回的将是字典形式的operation。那么,如果想得到列表形式的operation,该怎么做?
operation = ["add","sub"]
def get_operation():
operation = {"lucifer":10000}
global operation
return operation
operation = ["add","sub"]
def get_operation():
return operation
添加上面加粗部分的代码,或者如同第二段代码一样,就能得到列表形式的operation。
下面来介绍一下关键字global。global一般用于表明该变量是全局变量。搜索用global修饰的变量时,应该在全局变量中查找。上边的代码中使用global,表示在该条语句之后,使用的operation变量均是全局变量。global关键字的存在,导致很多代码的可读性和可维护性下降;同时,搜索全局变量比搜索局部变量要慢,导致全局变量在一定程度上将影响程序的性能。
在此,提出Python性能优化的第九条原则:除了实现switch语法和日志记录之外,在没有必要的情况下,禁止使用全局变量。
总结:
1)从循环的角度看,变量可以分为可迭代的变量和不可迭代的变量。
2)从执行的角度看,变量可以分为可调用的变量和不可调用的变量。
3)从作用域和搜索顺序的角度看,变量可以分为局部变量和全局变量。
- 点赞
- 收藏
- 关注作者
评论(0)