函数变量的修改 异常测试

python内部函数,引用全局变量以及修改全局变量的相关测试。

总结:

  1. 内部函数,不修改全局变量可以引用全局变量
  2. 内部函数,修改同名全局变量,则python会认为它是一个局部变量
  3. 在内部函数修改同名全局变量之前调用变量名称(如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 

原文地址:https://www.cnblogs.com/hellojesson/p/5845153.html