函数变量的修改 异常测试
python内部函数,引用全局变量以及修改全局变量的相关测试。
总结:
- 内部函数,不修改全局变量可以引用全局变量
- 内部函数,修改同名全局变量,则python会认为它是一个局部变量
- 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
python访问局部变量和全局变量的规则:当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量(这里有个疑问待确认:就是如果局部中没找到该变量,解释器会不会到上一层或者全局中查找),解释器就会抛出异常(NAMEERROR或者Unbound-LocalError,这取决于python版本。)
测试:
# 情况1 正常命令执行 修改变量值
# Python解释器默认是从上往下执行的 如果没有预先定义变量 而直接调用修改变量 解释器会在第一次查找变量没有找到的时候 抛出下方变量没有定义的异常 而此时已经不再往下执行
# x=x+1
# x=888 # 此步骤没有意义,因为在上步出现异常后,就不会走到这一步了
# print(x) # NameError: name 'x' is not defined
# 情况 2 函数中 修改变量值
# x = 6 # 定义全局变量
# def func():
# x = 1 # 此时修改同名的全局变量x Python解释器实际上是把x当成了一个新的局部变量 对其赋值
# return x
# print(x) #从输出结果来看,全局变量此时并没有被修改
# print(func()) # 返回新的局部变量x的值
# # 输出结果
# # 6
# # 1
# 情况 3
# x = 6 # 定义全局变量
# def func():
# x = x + 1 # 当函数被调用执行时候,Python解释器会先从func函数中查找 x变量,
# # 但是在引用x之后,发现x并没有被预先定义。也就是如下解释器的报错:在定义之前被应用了。
# # UnboundLocalError: local variable 'x' referenced before assignment
# #x = 888 # 其实加不加x=888 这一步 已经没有意义 因为根本就走不到这一步 这里,类比情况1 非函数中的执行。(这里暂时先这么理解,有待确认:解释器是先读到x=888还是根本不走这一步)
# return x
# print(x)
# print(func())
# # 输出结果
# # UnboundLocalError: local variable 'x' referenced before assignment
# 情况 4
# 接着情况3异常 如果我们确实要在局部函数中修改同名全局变量 该如何操作? 这里需要做一个申明。
# x = 6 # 定义全局变量
# def func():
# global x # 申明 x为全局变量
# x = x + 1 # 当函数被调用执行时候,Python解释器先从func函数中查找 x变量,先读到x为全局变量的申明。
# # 然后引用x=6 对该变量进行赋值操作。
# return x
# print(x) # 输出全局变量x 此时该值并没有发生变化,还是6,说明func函数引用全局变量的时候,只是暂时引用一下,重新赋值的x会被当作一个局部变量
# print(func()) # func()函数执行后,输出的结果为7
# 输出结果
# 6
# 7
# 情况 5
# x = 6 # 定义全局变量
# def func():
# global x # 此处申明下x为全局变量
# x = 1 # 此时修改同名的全局变量x Python解释器就把x当成全局变量 对其重新赋值更改
# return x
# func()
# print(x) # 从输出结果来看,全局变量被修改
# print(func()) # func函数中的变量x也被修改
# 输出结果
# 1
# 1
参考:http://blog.csdn.net/my2010sam/article/details/17735159
http://blog.csdn.net/onlyanyz/article/details/45009697
http://blog.csdn.net/magictong/article/details/4464024