python 中全局变量和局部变量在使用过程中的一个容易出错的地方

什么是全局变量

python中,在函数外部声明的变量可以叫做全局变量。

x = 10
def fn1():
    pass
fn1()

什么是局部变量

python中,在函数内部声明的变量通常情况下称之为局部变量,它的作用域也仅限在函数内部。

x = 10 # 全局变量
def fn1() :
    y = 20 # 局部变量,只能够在函数内部中使用
fn1() # 调用函数

容易出错的一个点

在使用全局变量和局部变量的过程中,有一种情况十分容易出错:

x = 10
def fn1() :
    print(x)
fn1()

上面这段代码,主要是在函数fn1中调用了全局变量x ,那么当函数调用的时候,输出的结果为10

x = 10
def fn1():
    x = 20
    print(x)
fn1()
print(x)

上面这段代码的输出结果为20、10,函数内部的print()输出的是函数内部的局部变量x,所以输出结果为20,而在函数外部使用print输出的结果为10,因为此时调用的是全局变量x,所以输出为10

再来继续看下面这段代码:

x =10
def fn1():
    print(x)
    x = 20
fn1()

一旦上面的这段代码执行,程序看似没什么问题,但是实际却会抛出一个错误,UnboundLocalError: local variable 'x' referenced before assignment.

出现错误的原因是因为,全局变量在函数中只能够查询,但是却不能够修改。一旦修改就会报错。

再来看刚才的一段代码:

x = 10
def fn1():
    x = 20
    print(x)
fn1()
print(x)

为什么这段代码没有报错呢?原因其实很简单,因为在这段代码中,函数外部的全局变量x值为10,但是在函数内部,第一句代码就是重新的创建了一个变量x,值赋值为20,这个时候函数内部的x作用域是局部的,仅限于函数内部,而函数外部的x是全局的,作用域为全局。

在函数内部的代码中,print()还没有输出前,就重新声明了个变量x,所以后面print输出的x,应该为局部变量x。

而刚才抛出错误的代码中是先使用的print输出,而此时输出的x为全局变量x,所以之后x = 20会抛出错误,因为python会认为,此时你不是单独的创建一个局部变量而是在修改全局变量,这一点是python不允许的。

Tip:全局变量在函数中只能够查看而不能够修改。

python中全局变量和局部变量的一个小坑的更多相关文章

  1. python中全局变量和局部变量

    例1: a = 100 #定义全局变量a def test1(): print(a) #此处a为全局变量 def test2(a):#此处a为局部变量 print(a)#此处a为局部变量 test1( ...

  2. js中全局变量和局部变量以及变量声明提升

    javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102  收藏 展开 [javascript] view plain copy ...

  3. PHP和JS中全局变量和局部变量

    一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...

  4. Python 中全局变量的实现

    一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...

  5. mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会

    <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...

  6. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  7. [LeetCode]29 两数相除和一个小坑点

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...

  8. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  9. 关于sniff函数的一个小坑

    最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.

随机推荐

  1. vmware克隆虚拟机后网卡名称及网络地址xiuf

    使用vmware克隆虚拟机后,若原主机网卡名称为eth0,那么克隆后的主机使用ifconfig查看仅能看到一个名称为eth1的网卡 并且在/etc/sysconfig/network-scripts/ ...

  2. Hadoop 笔记1 (原理和HDFS分布式搭建)

    1. hadoop 是什么 以及解决的问题 (自行百度) 2.基本概念的讲解 1. NodeName  master 节点(NN) 主节点 保存了metaData(元数据信息) 包括文件的owener ...

  3. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  4. java 抛出异常

    这种方式serviceImpl 方法不用throws异常,比较方便 if(count>0){ //或者 IllegalArgumentException java的 throw new Ille ...

  5. 小程序之发起请求 wx.request(object)的坑

    这是官方的API,然后官方的实例中 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { ...

  6. 探索Windows命令行系列(6):活用批处理解决实际问题

    1.批量修改文件名 2.批量重启服务 3.全盘搜索指定文件 3.1.全盘搜索名称为 mm.jpg 的文件,获取其全路径 3.2.查找系统中所有名称以 .docx 结尾的文件 4.调用可执行程序 4.1 ...

  7. JAVA基础——数组详解

    学习JAVA中数组的使用 一.什么是数组? 问:编写代码保存 4 名学生的考试成绩. 答:简单啊,定义 4 个变量呗 问:那"计算全年级 400 名学生的考试成绩",肿么办 答: ...

  8. static方法和非static方法的区别

    ●生命周期(Lifecycle):静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭. ...

  9. Error detected while processing function CheckFoam256 问题的解决

    今天在打开OpenFOAM的constant文件的时候, vim-OpenFOAM-syntax插件遇到了如下问题: Error detected while processing function ...

  10. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...