Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。

  • 函数定义了本地作用域,而模块定义的是全局作用域。
    如果想要在函数内定义全局作用域,需要加上global修饰符。
  • 变量名解析:LEGB原则
    当在函数中使用未认证的变量名时,Python搜索4个作用域[本地作用域(L)(函数内部声明但没有使用global的变量),之后是上一层结构中def或者lambda的本地作用域(E),之后是全局作用域(G)(函数中使用global声明的变量或在模块层声明的变量),最后是内置作用域(B)(即python的内置类和函数等)]并且在第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程中
    都没有找到,Python就会报错。
    补:上面的变量规则只适用于简单对象,当出现引用对象的属性时,则有另一套搜索规则:属性引用搜索一个或多个对象,而不是作用域,并且有可能涉及到所谓的"继承"
  • 以上基于http://blog.csdn.net/carolzhang8406/article/details/6855525
  • 下面探讨global修饰符的用法:
  • 首先是pythond的一个奇异现象,在模块层面定义的变量(无需global修饰),如果在函数中没有再定义同名变量,可以在函数中当做全局变量使用:
  • hehe=6
    def f():
    print(hehe)
    f()
    print(hehe)

    上述代码可以正常运行且输出为6和6

  • 但如果在函数中有再赋值/定义(因为python是弱类型语言,赋值语句和其定义变量的语句一样),则会产生引用了未定义变量的错误:
  • hehe=6
    def f():
    print(hehe)
    hehe=2
    f()
    print(hehe)

    抛出的错误信息为:

  • UnboundLocalError: local variable 'hehe' referenced before assignment
    而如果在函数中的定义在引用前使用,那么会正常运行但函数中的变量和模块中定义的全局变量不为同一个
  • hehe=6
    def f():
    hehe=2
    print(hehe)
    f()
    print(hehe)

    上述输出是2和6,也即f函数中print使用的是局部变量hehe,而最后一个print语句使用的全局hehe。

  • 那么我们会有疑问,如果我可能在函数使用某一变量后又对其进行修改(也即再赋值),怎么让函数里面使用的变量是模块层定义的那个全局变量而不是函数内部的局部变量呢?这时候global修饰符就派上用场了。
  • hehe=6
    def f():
    global hehe
    print(hehe)
    hehe=3
    f()
    print(hehe)

    在用global修饰符声明hehe是全局变量的hehe后(注意,global语句不允许同时进行赋值如global hehe=3是不允许的),上述输出是6和3,得到了我们想要的效果。

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

  1. Python中作用域的特别之处

    def a(): a = [] def aappend(): a.append(1) aappend() print a def b(): b = 1 def bchange(): b += 1 # ...

  2. 详解Python的作用域和命名空间

    最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己 ...

  3. 论python中的作用域

    编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...

  4. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  5. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

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

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

  7. Python中的变量作用域

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

  8. python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

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

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

随机推荐

  1. hdoj2604 Queuing(矩阵快速幂)

    此题如果直接利用递推关系,处理不好会超内存的. 首先找出递推关系式,先给出递推关系式:( L )=( L - 1 ) + ( L - 3 ) + ( L - 4 ):可以先尝试推导一下,推不出来再看下 ...

  2. 如何优雅的调戏XSS

    作者:i春秋作家——万年死宅 前言 这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下,该篇paper将涉及的内容: 正 ...

  3. 2018新年 flag 了解一下(每月初更新...)

    昨天(2018/3/2)是元宵节,这很恐怖,因为意味着 往后再也找不到这么冠冕堂皇的理由用来偷懒啦~ 嘤嘤嘤~ (我特么反手就是一拳,让你嘤嘤嘤) emm,跑题了. 正文 话说一日之计在于晨,一年之计 ...

  4. 【PaddlePaddle系列】手写数字识别

      最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...

  5. Xpath string()提取多个子节点中的文本

    <div> <ul class="show"> <li>275万购昌平邻铁三居 总价20万买一居</li> <li>00 ...

  6. Java 并发编程——volatile与synchronized

    一.Java并发基础 多线程的优点 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 这一点可能对于做客户端开发的更加清楚,一般的UI操作都需要开启一个子线程去完成某个任务,否者会容易导致客户 ...

  7. Java学习之路(十二):IO流

    IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据)     输出流(写数据) 流按操作 ...

  8. java 中break 和continue 的非常规用法

    正常情况下,break只能断掉最近的循环.(比如二个嵌套的for循环中 ,第二个循环的break.不会中断第一个for循环) 问题是: 嵌套中 如果要断掉任意其中的循环怎么做? 答案是: 加一个lab ...

  9. 拦截并记录数据库操作-Logging and Intercepting Database Operations

    原文:http://msdn.microsoft.com/zh-cn/data/dn469464 Logging and Intercepting Database Operations Starti ...

  10. 面试:http协议

    转自:http://www.cnblogs.com/ranyonsue/p/5984001.html#undefined HTTP简介 HTTP协议是Hyper Text Transfer Proto ...