编程语言从早至今,可以分为面向过程编程、面向函数编程和面向对象编程。BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持面向函数和面向对象编程。对于大型程序,无疑,面向对象编程更好一些。由于存在各种封装等级、封装方法,变量在不同的位置具有不同的有效区域。

一、全局变量与局部变量

  那这些和全局变量、局部变量有什么关系?在面向对象编程中,所有的对象,包括变量、方法、属性等等都被封装在类或函数中,程序看起来是这样的:

  PI = 3.1415926

  class c1():

    pass

  class c2():

    pass

  ......

  def f1():

    a = 10

    pass

  def f2():

    pass

  ......

  def main():

    pass

  mian()

  当然,上面只是个例子,实际并非一定如此。但也能基本说明问题了。绝大多数变量都被封装在自己的函数或类里,属于局部变量,只能在自己的小天地里画圈圈。

  这样做的好处是,作用域限定,互不干扰,各司其职。那些大家共同需要,共同维护的数据一般才声明为全局变量,它在所有作用域都可读。在Python里,它一般是全字母大写,并在顶头位置。我们非常不建议在包装精美的程序框架里,突然冒出个“孤魂野鬼”似的随意定义的全局变量。因此,在使用全局变量,我们通常有以下建议:

  1.无论在何处对全局变量进行重新赋值,请使用global关键字

  2.对于列表,字典等特殊数据类型的全局变量,可以在函数体内修改其元素,例如list.append()
  3.不要在函数、类中创建全局变量。这样会让全局变量不可查,不可控。

二、python的作用域

  在python中,作用域指的是某个变量的有效范围。

  1. python中没有块级作用域

  python中的块,指的是类似for循环、while循环、if条件语句,with语句等一个块块代码。没有块级作用域就是说在这些语句内部的变量和在外面的变量是一样的。这点与java和c#语言是有区别的。

if 1==1:  #if,for 等构成一个代码块
    name = 'zhang'
#代码块结束
 print(name)

  上面的代码在python中正常执行。但在JAVA中报错,java的解释器会认为变量name没有预先定义。

  2. python中的最小作用域是函数,函数管理者最小有效范围的局部变量。

  这一点相信没有人会有疑问

  3.python采用作用域链的机制,类似类的继承机制。

  当在函数内使用一个它本身内部不存在的变量时,它会逐级向外围更大的作用域进行查找,如果最后还没找到则报错。

name = 'zhang'
def func():
    name='a'
    #print(name)
    def f2():
        name='b'
        print(name)
    f2()
func()
>>>
b

  变量name在func和f2中都有定义,执行func()的时候,先赋值name='a',然后执行f2(),重新定义name = 'b',在执行print(name)的时候,输出的结果为‘b’

  4. python内的函数在未执行之前,作用域和作用域链就已经全部确定。

name ='alex'
def f1():
    print(name) #f1继承自己的作用域

def f2():
    name = 'eric'
    f1()
f2() #执行f1()
>>>
alex

  下面的例子也一样:

name = 'zhang'
def f1():
    print(name)
def f2():
    name = 'eric'
    #print(name)
    return f1
ret = f2()
ret()
>>>
zhang

  4. python是门动态语言,函数在未执行之前,只是简单的扔到内存里。

name = 'zhang'

def f2():
    name = 'eric'
    print(age)
    return f1

def f1():
    print(name)

age = 18
ret = f2()
ret()

  上面代码中,f1函数和age变量都出现在f2函数之后,执行程序没有任何问题。

论python中的作用域的更多相关文章

  1. Python中的作用域

    Python中的作用域 Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索: 本地作用域(Local)→当前作用域被嵌 ...

  2. python中的作用域与名称空间

    python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...

  3. Python中的作用域及global用法

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域. 如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LE ...

  4. python中的作用域以及内置函数globals()-全局变量、locals()-局部变量

    在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...

  5. python中函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = 'sthu' print('在change_name里的name:' ...

  6. Python 中的作用域?

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定. 当 Python 遇到一个变量的话,它会按照这的顺序进行搜索:本地作用域(Local)--->当前作用域被嵌入的本地作用域( ...

  7. Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...

  8. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  9. Python闭包及其作用域

    Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...

随机推荐

  1. js 生成笛卡尔积

    其实生成 笛卡尔积的方法原本很简单,for循环就可以了, function discarts() { //笛卡尔积 var twodDscartes = function (a, b) { var r ...

  2. Initializing a collection

    Before Java 1.7, only this one is permitted: ArrayList<String> a = new ArrayList<String> ...

  3. 使用json-lib进行Java和JSON之间的转换 [转]

    [转] http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java对 ...

  4. JavaScript日期对象使用总结

    javascript Date日期对象的创建 创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date(& ...

  5. Struts2中的 配置文件

    struts2中涉及到的配置文件有: web.xml.struts.xml.struts.properties.default.properties.struts-default.xml web.xm ...

  6. fio terse输出详解

    fio, the flexible IO tester, is a very useful tool for benchmarking IO performance. It has an option ...

  7. C# 向Http服务器送出 POST 请求

    //向Http服务器送出 POST 请求 public string m_PostSubmit(string strUrl,string strParam) { string strResult = ...

  8. asihttprequest本机调试时正常,发布后闪退

    "Compile sources" -->"Build Phases" 找到ASIFormDataRequest.m和ASIHTTPRequest.m,修 ...

  9. Multipart/form-data POST文件上传详解

    Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form ...

  10. 使用 Portable Class Library(可移植类库)开发 Universal Windows App

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...