• 函数与模块间作用域的区别


    在开始编写函数之前,我们编写的所有的代码多少位于一个模块的顶层(也就是说,并不是嵌套在def之中),所以我们使用的变量名要么就是存在于模块文件本身,要么就是Python内置预先定义好的(例如open).函数提供了嵌套的命名空间(作用域),使其内部使用的变量名本地化,以便函数内部使用的变量名不会与函数外(在一个模块或是其他的函数中)的变量名产生冲突.

    再次声明,函数定义了本地作用域而模块定义的是全局作用域,这两个作用域有如下的关系:

    • 内嵌的模块是全局作用域.每一个模块多少一个全局作用域(也就是说,一个创建于模块文件顶层的变量的命名空间).对于外部的全局变量就成为一个模块对象的属性,但是在一个模块中能够像简单的变量一样使用.
    • 全局作用域的作用范围仅限于单个文件. 别被这里的'全局'所迷惑,这里的全局指的是在一个文件的顶层的变量名仅对于这个文件内部的代码而言是全局的.在python中是没有基于一个单个的,无所不包的情景文件的全局作用域的.替代这种的方法是,变量名由模块文件隔开,并且必须精确地导入一个模块文件才能够使用这个文件中定义的变量名.当你在Python中听到'全局的',你就应该想到'模块'.
    • 每次对函数的调用都创建了一个新的本地作用域. 也就是说,将会存在由那个函数创建的变量的命名空间.可以认为每一个def语句(以及lambda表达式)都定义了一个新的本地作用域,但是Python允许函数在循环中调用自身(递归),所以从技术上讲,本地作用域实际上对应的是函数的调用.换句话说,每一个函数调用都创建了一个新的本地命名空间.递归在处理不能提前预知的流程结构时是一个有用工具.
    • 赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量. 在默认情况下,所有函数定义内部的变量名是位于本地作用域内的(与函数调用相关的).如果需要给一个在函数内部却位于模块文件顶层的变量名赋值,需要在函数内部通过global语句声明.如果需要给位于一个嵌套的def中的名称赋值,从Python3.0开始可以通过在一条nonloal语句中声明它来做到.
    • 所有其他的变量名都可以归纳为本地,全局或者内置的. 在函数定义内部的尚未赋值的变量名是一个在一定范围内(在这个def内部)的本地变量,全局(在一个模块的命名空间内部)或者内置变量(由Python的预定义__builtin__模块提供的).
  • 相关阅读:
    Java Calendar详解
    Java Calendar 类的时间操作
    java获取properties配置文件值
    解决Eclipse中.properties文件中文乱码问题
    java web每天定时执行任务(四步轻松搞定)
    为经典版eclipse增加web and JavaEE插件
    VMware创建虚拟机教程详解及问题解决
    Eclipse对svn操作切换账号或更换svn地址方法
    oracle 查看用户所在的表空间
    (转)CentOS之7与6的区别
  • 原文地址:https://www.cnblogs.com/ppf3678/p/10060113.html
Copyright © 2020-2023  润新知