• 函数变量的修改 异常测试


    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 

  • 相关阅读:
    匹配域名
    异步加载js文件
    Python3.X BeautifulSoup([your markup], "lxml") markup_type=markup_type))的解决方案
    CSDNmarkdown编辑器直接写代码的小效果(一生愿)
    JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)
    JAVA_OA(十四):SSM练手项目bug-Oracle分页web页面无法转到下一页
    JAVA_OA(十四):SSM练手项目bug-JSP页面传递参数的编码问题
    JAVA_OA(八):springMVC对JDBC的操作小项目b
    完全卸载oracle11g教程、Oracle11g的卸载方法和步骤
    JAVA_OA(八):springMVC对JDBC的操作小项目a
  • 原文地址:https://www.cnblogs.com/hellojesson/p/5845153.html
Copyright © 2020-2023  润新知