在被调用函数内部赋值的变量,处于该函数的局部作用域,函数之外的变量,属于全局作用域。函数内部的变量就是局部变量,函数之外的变量称为全局变量。
- 全局作用域中的代码不能使用局部变量
- 局部作用域可以访问全局变量
- 一个函数内部的代码,不能使用其他函数中的变量
- 在不同的作用域中可以用相同的名字命名变量
- 在小程序中使用全局变量没有大的问题,但当程序变得越来越大时,依赖全局变量是一个坏习惯。
局部变量不能在全局变量中使用
def spam():
eggs=31337
spam()
print(eggs)
结果
print(eggs)
NameError: name 'eggs' is not defined
局部作用域不能使用其他局部作用域的变量
def spam():
eggs=99
bacon()
print(eggs)
def bacon():
ham=101
eggs=0
print(ham)
spam()
结果:
101
99
一个函数虽然可以调用其他函数,但对其中的变量并不能调用。也就是说局部变量在被其他函数调用时会销毁。
全局变量可以在局部作用域中读取
def spam():
print(eggs)
eggs=42
spam()
结果
42
名称相同的局部变量和全局变量
原则上应当避免局部变量和全局变量或者其他作用域的变量同名。但在技术上局部变量和全局变量同名是合法的。
def spam():
eggs="张三"
print(eggs)
def bacon():
eggs="李四"
print(eggs)
spam()
eggs="王五"
bacon()
print(eggs)
结果
李四
张三
王五
局部作用域内部有变量时,优先调用自身,全局作用域不能调用局部作用域的变量。
global语句
如果想在全局作用域调用局部变量,那么在函数内部使用global语句。
def spam():
global eggs
eggs="张三"
eggs='李四'
spam()
print(eggs)
结果:
张三
使用global语句将局部变量声明成全局变量,当然编程执行原则是自上而下,顺序执行,所以打印出张三,而不是李四。如果将eggs='李四'放在spam()函数调用之后,结果将输出李四。
函数作为黑盒。通常对于一个函数,只要知道它的输入值和输出值就行,并非总是需要弄清楚函数代码是怎样工作的。以这种高层的方式思考函数,通常来说,将函数看成一个黑盒。而且在编写函数时不使用全局变量,通常也不必担心函数代码与其他程序发生交叉影响。
网友评论