局部和全局作用域
在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量称为“全局变量”。作用域遵循如下的原则:
- 全局作用域的代码不能使用任何局部变量
- 局部作用域可以访问全局变量
- 一个函数的局部作用域的代码,不能使用其他局部作用域的变量。
- 在不同的作用域中,可以使用相同的名字命名不同的变量。
1 def spam(): 2 eggs = 31337 3 spam() 4 print(eggs)
如上所示的代码,运行之后将会报出如下所示的错误:
Traceback (most recent call last): NameError: name 'eggs' is not defined
报错的原因是没有找到变量eggs,因为在全局变量域中引用了局部变量,而程序执行在全局作用域重视,不存在局部作用域,所以不会有任何局部变量。这就是为什么只有全局变量能用于全局作用域。
2.局部作用域不能使用其他局部作用域内的变量
一个函数被调用时,就创建了一个新的局部作用域,这包括一个函数被另一个函数调用时的情况。
def spam(): eggs = 99 bacon() print(eggs) def bacon(): ham = 101 eggs=0 spam()
上示代码中两个函数都对变量eggs进行了定义,且spam函数对bacon函数进行了引用。但因为一个函数中的局部变量完全与其他函数中的局部变量分隔开来。所以代码的输出结果如下所示:
99
3.全局变量可以在局部作用域中读取
eggs = 42 def spam(): print(eggs) spam()
上示代码先定义了一个全局变量eggs,之后在函数中打印全局变量的值。最后调用函数spam。输出结果如下:
42
4.名称相同的局部变量和全局变量
名称相同的局部变量和全局变量在python中是完全合法的。但因为在代码中多个变量同名,在追踪时不方便,且容易让人混淆,所以不介意使用。在此也不做示例。
5.global语句
使用global语句可以将函数内的变量修改成全局变量。