当我们开始编写一个程序时,设定的变量就默认为是全局变量。
局部变量:当我们定义一个函数模块时,模块里的内容就是局部变量。
局部变量运行完毕之后,就会被销毁。同理,当一个程序运行完毕之后,程序里的变量也会被销毁。
它们之间的关系:
局部变量可以引用全局变量中的内容
全局变量不可以引用局部变量中的内容
一个局部变量不能使用另外一个局部变量中的内容
如果在不同的作用域中,你可以用相同的名字去命名不同的变量。也就是说可以使用一个名为change的全局变量和一个名为change的局部变量。
局部变量可以引用全局变量中的内容
程序为:
def spam():
print(eggs)
eggs = 42
spam()
print(eggs)
运行结果为:
42
42
定义的函数在刚被定义时并不执行,所以代码从eggs=42处开始执行,由于局部作用域中没有eggs变量,则局部作用域调用全局变量中的eggs=42,因此执行spam()后的结果是打印42,再执行print(eggs)的结果也是打印出42.
全局变量不可以引用局部变量中的内容
程序为:
def spam():
eggs=31337
spam()
print(eggs)
运行结果为:
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 4, in
print(eggs)
NameError: name 'eggs' is not defined
spam()函数在被调用时给eggs赋值为31337,调用完成后,eggs变量被销毁。所以print(eggs)处会出现变量未被定义的情况。
一个局部变量不能使用另外一个局部变量中的内容
程序为:
def spam():
eggs = 99
bacon()
print(eggs)
def bacon():
ham = 101
eggs = 0
spam()
运行之后的结果是:99
调用spam()函数时执行eggs=99,然后调用bacon()函数,虽然其中为eggs赋值为0,但是bacon()函数调用结束时,eggs变量被销毁,所以print(eggs)只能打印出99。
名称相同的局部变量和全局变量。
【一般不提倡这种做法,不方便检查和使用。】
程序为:
def spam():
eggs='spam local'
print(eggs)#prints 'spam local'
def bacon():
eggs='bacon local'
print(eggs)#prints 'bacon local'
spam()
print(eggs)#printd 'bacon local'
eggs='global'
bacon()
print(eggs)
程序的执行结果为:
bacon local
spam local
bacon local
global
在这个程序中,有三个名为eggs的变量,分别位于spam()、bacon()、和全局变量中。虽然名字相同,执行时可以正常执行,因为每个局部变量执行完毕之后就会被 销毁,所以下个局部变量,甚至全局变量使用与之前局部变量相同的变量名称也无所谓。
global语句
在我们定义了一个函数之后,函数所处的局部作用域内,出现的变量是局部变量。但如果我们希望在定义函数的时候,设置的变量就能修改全局作用域中的内容,就可以在变量前加上global语句。如:
def spam():
global eggs
eggs='spam'
eggs = 'global'
spam()
print(eggs)
程序执行结果为spam
回过头来,让我们看一下程序。首先eggs被赋值为‘global’,然后调用spam()函数,这时函数内部定义的函数并没有在返回时被销毁,因为为它加了global语句,变成了全局变量,所以调用函数的结果为eggs再次被赋值为‘spam’覆盖了之前的‘global’,因此被打印出‘spam’。
4条法则来区分一个变量是局部作用域还是全局作用域
1)如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
2)如果在一个函数中,有针对该变量的global语句,它就是全局变量。
3)否则,如果该变量用于函数的赋值语句,它就是局部变量。
4)但是,如果该变量没有用在赋值语句中,它就是全局变量。
举例:
def spam():
global eggs
eggs='spam'#这是一个全局变量
def bacon():
eggs='bacon'#这是一个局部变量
def ham():
print(eggs)#这是一个全局变量
eggs=42#这是一个全局变量
spam()
priint(eggs)
在一个函数中,一个变量要么总是局部变量,要么总是全局变量。函数中的代码没有办法先使用名为eggs的局部变量,稍后又在同一个函数中使用eggs的全局变量。如:
def spam():
print(eggs)
eggs ='spam local'
eggs = 'global'
spam()
函数运行的结果如下,会报错。
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 5, in
spam()
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 2, in spam
print(eggs)
UnboundLocalError: local variable 'eggs' referenced before assignment
因为在函数内部有关于eggs的赋值,Python就认为eggs是局部变量,但print(eggs)位于变量赋值之前,eggs还未赋值,但又不能向下使用全局变量中eggs的赋值,所以就会被报错。
领取专属 10元无门槛券
私享最新 技术干货