局部和全局作用域
在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”
*全局作用域中的代码不能使用任何局部变量;
*但是,局部作用域可以访问全局变量;
*一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量。
*在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个名为spam的局部变量,和一个名为spam的全局变量。
复制代码
不让所有东西变成全局变量,当特定函数调用中的代码修改变量时,该函数与程序其他部分的交互,只能通过它的参数和返回值。这缩小了可能导致缺陷的代码作用域。
def spam():
eggs = 311337
spam()
print(eggs)
Traceback (most recent call last):
File "C:/Users//.PyCharm2018.3/config/scratches/infiniteloop.py", line 4, in <module>
print(eggs)
NameError: name 'eggs' is not defined
复制代码
eggs输入spam局部作用域,执行行从spam返回后,局部作用域被摧毁,不再有eggs的变量
**局部作用域不能使用其他局部作用域内的变量
def spam():
eggs = 99
bacon()
print(eggs)
def bacon():
ham = 101
eggs = 0
spam()
复制代码
输出为99
print(eggs)
eggs = 42
spam()
print(eggs)
复制代码
打印出42
如果需要在函数内修改全局变量,使用global语句 global eggs eggs指全局变量,eggs被赋值时,赋值发生在全局作用域的eggs上,没有创建局部eggs变量
def spam():
global eggs
eggs = 'spam'
eggs = 42
spam()
print(eggs)
复制代码
输出spam
如果变量没有用在赋值语句中就是全局变量
def ham():
print(eggs) #This is the global
eggs = 42
ham()
复制代码
输出为42
在一个函数中,如果试图在局部变量赋值之前就使用它,就会报错
def spam():
print(eggs) #ERROR!
eggs = 'spam local'
eggs = 'global'
spam()
Traceback (most recent call last):
File "C:/Users/.PyCharm2018.3/config/scratches/infiniteloop.py", line 5, in <module>
spam()
File "C:/Users/.PyCharm2018.3/config/scratches/infiniteloop.py", line 2, in spam
print(eggs) #ERROR!
UnboundLocalError: local variable 'eggs' referenced before assignment
复制代码