在函数内定义的变量,在函数的 “局部作用域” 中;而在函数外定义的变量,在 “全局作用域” 中。
在程序启动时,会创建一个全局作用域。当程序终止时,就会销毁这个作用域,其内部保存的变量也会被一同销毁。
一个函数被调用时,会创建一个局部作用域。当这个函数返回时,这个作用域就会被销毁。
1 全局作用域内,不能使用局部变量
全局作用域内如果使用了局部变量,就会抛错:
def cook():
dumplings = 3
cook()
print(dumplings)
运行结果:
NameError: name 'dumplings' is not defined
因为 cook() 返回后,其局部作用域中的 dumplings 变量也被一同销毁了,所以在全局作用域内无法访问。
2 局部作用域内,不能使用其它局部作用域内的变量
def dumpling():
dumplings = 5
print('dumpling()=' + str(dumplings))
def cook():
dumplings = 3
dumpling()
print('cook()=' + str(dumplings))
cook()
运行结果:
dumpling()=5
cook()=3
cook() 中调用了 dumpling(),因此其同名的 dumplings 变量被重新定义了。也就是说,一个函数内定义的局部变量与其它函数内部定义的变量,是完全隔离的。
另外,这个示例也说明了:不同作用域中的变量,可以同名。但不建议这样做,因为变量名相同,我们不好跟踪代码。
3 局部作用域内,可以使用全局变量
def cook2():
print(dumplings)
dumplings = 3
cook2()
运行结果:
3
总的来说,作用域与变量遵守以下规则:
- 全局作用域中的代码,无法使用局部作用域中定义的变量。
- 局部作用域可以使用局部作用域中的定义的变量。
- 一个函数局部作用域中,无法使用其它局部作用域中的变量。
- 变量如果分别定义在不同的作用域中,那么可以同名(不建议这样做)。