在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能既是局部的又是全局的。
可以将“作用域”看成是变量的容器。当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个全局作用域,它是在程序开始时创建的。如果程序终止,全局作用域就被销毁,它的所有变量就被丢弃了。局部作用域可以很多个,但是每次执行完就会销毁。
文章目录
1.局部变量不能在全局作用域内使用
示例代码如下:
def func():
number = 123
func()
print(number)
# >>>NameError: name 'number' is not defined
程序报错原因是number变量是局部变量,当程序执行fuc后,返回时就会销毁局部作用域,number就会随之销毁,就不会存在名叫number的变量。所以python会报错找不到number的定义。所以局部变量不能再全局作用域内使用。
2.全局变量可以在局部作用域中读取
示例代码如下:
def func():
print(number)
# >>>123
number = 123
func()
print(number)
# >>>123
因为func函数内,没有变量number,当函数执行时,python会认为它是对全部变量number的引用。所以打印出123。
3.名称相同的局部变量和全局变量
在技术上,在 Python 中让局部变量和全局变量同名是完全合法的。示例代码如下:
def func1():
number = 1
print(number)
# >>>1
def func2():
number = 2
print(number)
# >>>2
func1()
print(number)
# >>>2
number = 3
func2()
print(number)
# >>>3
4.global 语句
如果需要在一个函数内修改全局变量,就使用 global 语句。示例代码如下:
# 4
def func():
global number
number = 123
number = 456
func()
print(number)
# >>>123
因为 number在 func()的顶部被声明为 456,所以当 number被赋值为123时,赋值发生在全局作用域的 456上(没有创建局部 number变量)。
有 4 条法则,来区分一个变量是处于局部作用域还是全局作用域:
1.如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
2.如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。
3.如果该变量用于函数中的赋值语句,它就是局部变量。
4.如果该变量没有用在赋值语句中,它就是全局变量。
在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错:
def func():
print(number)
number=456
number=123
func()
# >>>UnboundLocalError: local variable 'number' referenced before assignment
发生这个错误是因为,Python 看到 func()函数中有针对 number的赋值语句,因此认为 number变量是局部变量。但是因为 print(number)的执行在 number赋值之前,局部变量 numver并不存在。Python 不会退回到使用全局 number变量。
都看到这里了,如果觉得有用就点个赞吧!!