编程语言从早至今,可以分为面向过程编程、面向函数编程和面向对象编程。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. 管理windows防火墙

    1.导出防火墙规则 netsh advfirewall export "c:\advfirewall.wfw" 2.禁用防火墙 netsh firewall set opmode ...

  2. windows批处理

    1.日期作为变量当做文件名的一部分. C:\Documents and Settings\Simon>echo %date%2008-09-09 星期二 C:\Documents and Set ...

  3. [C] tcharall(让所有平台支持TCHAR)v1.1。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    作者:zyl910 v1.1版的改动如下—— 将源码上传到github. 调整目录结构. 添加CMake编译配置文件. 使用doxygen规范注释. 文件清单—— docs\ docs\images\ ...

  4. H-Basis/SG/SH GI Relighting

    小试了一把预计算全局光照,作为PRT的上级应用.完全自行实现,使用SG/SH.H-Basis基波对GI光场进行频域压缩,存在3D纹理中,用于2跳间接光照实时显示.其中坑点不少,尤其是在HDR环境下使用 ...

  5. jquery scrollLeft居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Ecshop文章列表页显示内容摘要

    本教程中讲到的“内容摘要”指的是文章内容的前 60个字符(当然也可以是前40个,前50个等等) 下面以 2.7.2版 + 官方默认模板 为例进行讲解: 1).修改 includes/lib_artic ...

  7. 面向.Net程序员的后端性能优化实战

    最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一 ...

  8. ios中将事件添加到系统日历

    - (void)saveEvent:(id)sender { //事件市场 EKEventStore *eventStore = [[EKEventStore alloc] init]; //6.0及 ...

  9. [AX2012]发送广播邮件

    AX 2012可以使用MAPI或者SMTP发送邮件,MAPI是客户端方法,需要outlook的协作,而SMTP则是服务器端方法,要求SMTP允许AOS服务器通过它中继.这里要讲的就是如何通过SMTP发 ...

  10. jQuery超炫酷按钮插件及源码

    现在大部分网页的按钮都是经过美化的,那些原始的浏览器按钮太过于枯燥乏味,让用户失去和网站交互的兴趣.早期我们都是通过背景图片来美化网页按钮,而现在我们可以利用扩展性更好的CSS3来制作漂亮的网页按钮, ...