Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
内建作用域
内置作用域是通过一个名为builtin的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:
import builtins
dir(builtins)
全局变量,局部变量举例
def changeme(mylist): # "修改传入的列表" mylist.append([1, 2, 3, 4]) # 这里没有定义,也没有报错,说明milist以已经存在,修改的是全局变量 print("函数内取值1: ", mylist) print("2", id(mylist)) # mylist.clear() mylist = [9,8,7,6,] # 这里定义的是局部变量,和函数外定义的同名列表的id是不一样的,一个是局部变量一个是全局变量,以下在修改是局部变量,和全局变量没有关系。对可更改类型的引用进行修改,结果就不一样了。
print("函数内取值2: ", mylist) print("3", id(mylist)) return mylist # 调用changeme函数 mylist = [10, 20, 30] print("1", id(mylist)) print("4", id(changeme(mylist))) print("函数外取值: ", mylist) print("5", id(mylist))
global 和 nonlocal关键字
global:当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
Nonlocal:如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了(在二层函数中修改一层函数的局部变量)