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中的作用域及global用法的更多相关文章

  1. 论python中的作用域

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

  2. Python中的作用域

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

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

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

  4. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  5. Python中【__all__】的用法

    Python中[__all__]的用法 转:http://python-china.org/t/725 用 __all__ 暴露接口 Python 可以在模块级别暴露接口: __all__ = [&q ...

  6. python中enumerate()函数用法

    python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

  7. Python中try...except...else的用法

    Python中try...except...else的用法: try:    <语句>except <name>:    <语句>          #如果在try ...

  8. Python中logging模块的基本用法

    在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...

  9. (转)Python中的split()函数的用法

    Python中的split()函数的用法 原文:https://www.cnblogs.com/hjhsysu/p/5700347.html Python中有split()和os.path.split ...

随机推荐

  1. (五)qt资源文件

    // 规则: :+添加的前缀/+文件名 ui->actionSave_as->setIcon(QIcon(":/new/Image/face.png"));

  2. redis源码解析(1):redisObject对象说明

    Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构. redis3.0 中对象结构: typedef struct redi ...

  3. Subversion配置

    1.下载Apache-Subversion-1.9.7:https://github.com/wangfajun/dev-tools 2.打开idea-->File-->Settings, ...

  4. Newton's Dark Secrets《牛顿探索》

    1643年1月4日,在英格兰林肯郡小镇沃尔索浦的一个自耕农家庭里,牛顿诞生了.牛顿是一个早产儿,出生时只有三磅重,接生婆和他的亲人都担心他能否活下来.谁也没有料到这个看起来微不足道的小东西会成为了一位 ...

  5. [物理学与PDEs]第5章第4节 本构方程 - 应力与变形之间的关系

    5. 4 本构方程 - 应力与变形之间的关系 5.4.1. 本构关系的一般形式 1. 若 Cauchy 应力张量 ${\bf T}$ 满足 $$\bex {\bf T}({\bf y})=\hat{\ ...

  6. java8 list和map的forEach

    list forEach示例 public class HelloWorld { public static void main(String[] args) { List<User> l ...

  7. JavaScript复习

    一.常用对话框 1.alert(""):警告对话框,作用是弹出一个警告对话框 2.confirm(""):确定对话框,弹出一个带确定和取消按钮的对话框——确定返 ...

  8. java对象在内存中的结构

    在HotspotJVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢?要知道一个对象的大 ...

  9. spring整合junit

    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test& ...

  10. Django-3-Template模板

    模板是html文档+Django逻辑语句的组合. 一.变量和标签 变量通过{{ }}来表示,两个大括号中间是变量名. 标签通过{% %}来表示,就是Python中的函数和方法. 常用标签: {% fo ...