Python 作用域

一个变量的作用域指的是这个变量的命名空间,即这个变量在代码中被赋值的位置已经这个变量在这个文件或者函数中可以访问到的范围。一个变量的作用域由它在代码中被赋值的地方决定。

局部变量与全局变量

全局变量一般是在文件/模块内,函数外被定定义的变量,它的作用域是从被赋值地地方到文件/模块结束。如果在一个函数内定义一个变量,那么这个变量就是一个局部变量,它的作用域仅仅是在该函数内被使用。在函数内和函数外定义两个相同的变量名的变量并不影响相互的使用。

# -*-coding:utf-8 -*-
__author__ = 'zhaixue.cc'
a = 100
def func():
    a = 50
    print 'a = %d'%a
func()
print a

运行结果:

C:\Python27\python.exe F:/python/python_proj/base.py
a = 50
100
Process finished with exit code 0

通过结果我们可以看到,在函数内对a进行赋值修改,并不会影响全局变量a。这里我们也可以得出一个结论:对于在不同作用域的两个变量,可以有相同的变量名,并不影响相互的使用。但是为了程序的可读性和维护性,建议还是不要这样做。
一般函数(def、lambda)、类(class)、模块(module)都会引入新的局部变量作用域。
如果我们在函数内想使用全局变量,需要在函数内使用global语句声明a是全局变量,然后才就可以使用了:

# -*-coding:utf-8 -*-
__author__ = 'zhaixue.cc'
a = 100
def func():
    global a
    a = 50
    print 'a = %d'%a
func()
print a

运行结果:

C:\Python27\python.exe F:/python/python_proj/base.py
a = 50
50
Process finished with exit code 0

内置定义域

除了全局变量和局部变量,Python还有一个内置的变量,它是在内置模块中预定义的变量名。内置作用域的范围最大。它们之间的关系如下:

内置作用域 > 当前模块中的全局变量的作用域 > 局部变量的作用域

内置作用域是一个名为builtin的内置模块,当我们import一个内置模块时,built才可以当做内置作用域使用。

LEGB原则

当我们使用一个变量名引用一个对象时,Python会到上面的三个作用域进行查找,首先是本地,然后是函数内,之后是全局,最后如果都没有找到,就会到内置作用域里去查找。
L—-local局部名字空间
E—-enclosing直接外围空间,即上一层嵌套结构
G—-global全局名字空间
B—-builtin内建名字空间
变量名会按照这个顺序进行搜索。

小结

本小节主要了解了变量的作用域使用。一般来讲,函数的定义、类以及模块代码都会产生新的作用域。每一个模块/文件都是全局作用域,创建于模块文件顶层的变量具有全局作用域。在一个函数内,赋值的变量名除非声明为全局变量,否则均为本地变量。所有的变量都可以归纳为本地、全局和内置三种变量,变量名会按照LEGB原则进行搜索。

《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客