1.作用域
作用域就是指命名空间,python创建、改变或查找变量名都是在所谓的命名空间中。
1.局部变量
局部变量,是指在函数内部或代码块中定义的变量,在没有其他操作的情况下,只有内部可以进行访问。
2.全局变量
定义在所有函数之外的变量。
3.局部and全局Test
我们定义一个函数myfun()在里面定义一个局部变量 我们在函数内部使用print()方法会打印出a的值。
def myfun():
a = 100 #函数内部定义一个局部变量 a
print(a)
myfun()
100
如果在函数外部使用print()打印一下会出现什么结果呢?
def myfun():
a = 100
print(a)
print(a)
NameError: name 'a' is not defined
这时候会给我们提示报错信息 NameError: name 'a' is not defined,没有找到 a
这是因为在函数内部定义的变量只有在函数内部可以访问的到,在函数外面是访问不到局部变量的值的。
如果我们定义一个全局变量,在函数内部和外部是否都可以访问的到呢?
a = 100 #在函数外面定义一个全局变量 a
def myfun():
print("我是函数内部打印的a,我的值为:{}".format(a))
myfun() #调用函数
print("我是函数外部打印的a,我的值为:{}".format(a))
我是函数内部打印的a,我的值为:100
我是函数外部打印的a,我的值为:100
我们可以看得到,在函数外面定义的全局变量 a,无论是在函数内部还是在函数外面都是可以访问的到的,说明全局变量在函数内部和外部是否都可以访问的到。
我们不妨试想一下,在函数内外定义一个变量名相同值不同的变量,我们进行访问会出现什么结果。
a = 100 #全局变量的值为100
def myfun():
a = 200 #局部变量的值为200
print("我是函数内部打印的a,我的值为:{}".format(a))
myfun()
print("我是函数外部打印的a,我的值为:{}".format(a))
我是函数内部打印的a,我的值为:200
我是函数外部打印的a,我的值为:100
结果显而易见,在函数内部打印的是函数内部定义的变量的值,在函数外面打印的是在函数外面定义的变量的值,根据上面的几个小例子,我们不难总结出:当只在函数内部定义变量而没有定义全局变量的时候,函数外部是访问不到函数内部的变量的,当定义了全局变量而没有在函数内部定义局部变量的时候,函数内部和外部都可以访问的到全局变量的值,当定义的全局变量和局部变量的变量名相同的时候,函数外部访问的是全局变量的值,函数内部会优先访问局部变量的值,当函数内部没有定义局部变量的时候才会访问全局变量的值。
4.拓展
在函数内部想去改变同名的全局变量的值该怎么做呢?
这时候我们要用到global关键字。
a = 100
def myfun():
global a #使用global关键字修饰
a = 200
print("我是函数内部打印的a,我的值为:{}".format(a))
myfun()
print("我是函数外部打印的a,我的值为:{}".format(a))
我是函数内部打印的a,我的值为:200
我是函数外部打印的a,我的值为:200
这时候我们就改变了全局变量的值,如果没有定义全局变量并且不用global修饰会出现什么结果呢?
我们可以测试一下:
def myfun():
a = 123
print("我是函数内部打印的a,我的值为:{}".format(a))
myfun()
print("我是函数外部打印的a,我的值为:{}".format(a))
我是函数内部打印的a,我的值为:123
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/123.py", line 8, in <module>
print("我是函数外部打印的a,我的值为:{}".format(a))
NameError: name 'a' is not defined
结果显而易见,外部打印出现了错误,这是我们用global修饰一下,感受一下global的作用
def myfun():
global a
a = 123
print("我是函数内部打印的a,我的值为:{}".format(a))
myfun()
print("我是函数外部打印的a,我的值为:{}".format(a))
我是函数内部打印的a,我的值为:123
我是函数外部打印的a,我的值为:123
这说明,在没有创建全局变量的情况下,使用global关键字修饰局部变量,就相当于定义一个新的全局变量。