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. mac中使用 sourcetree 的快速配置和git服务器登录

    问题: 1.mac中下载sourcetree配置仓库地址,一直在提示输入密码,无法登录成功,更无法获取源码. 2.找不到配置仓库时的账号密码,只看到地址. 场景: git服务器:自己的GIT服务器,非 ...

  2. Google云平台技术架构

    Google Cloud  设计原理: 1.分布式文件系统: Google Distributed File System(GSF)   为了满足Google迅速增长的数据处理需求,我们设计并实现了G ...

  3. .net 4.0 中的特性总结(二):默认参数、命名参数

    1.在方法定义的时候为参数指定一个默认值.调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里.例如: 2.在之前版本的C#中,方法定义的参数顺序必须与方法调 ...

  4. JAVA基础-JSON

    /** * 1.根据接收到的JSON字符串来解析字符串中所包含的数据和数据对象 */ System.out.println("1.根据接收到的JSON字符串来解析字符串中所包含的数据和数据对 ...

  5. CoolBlog开发笔记第2课:搭建开发环境

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 前言 今天是CoolBlog开发笔记的第2课,我们将要讲解的是开发环境的搭建.俗话说"工欲善其事必先利其器",Djang ...

  6. select change事件给其它元素赋值,本select的value或tex

    select change事件给其它元素赋值,本select的value或textonchange='$("#areaname").val($("option:selec ...

  7. Android 串口设置校验位、速率、停止位等参数

    Android 串口通讯设置校验位.速率.停止位等参数 最近业余时间有个android项目需要和硬件进行通信,通讯方式都是通过串口,android串口通讯google有个开源的demo 和很多人一样我 ...

  8. 如何用JavaScript复制到剪贴板

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

  9. LVS工作模式与调度算法

    LVS三种工作模式.十种调度算法介绍 工作模式介绍: 1.Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配 ...

  10. 【LeetCode】220. Contains Duplicate III

    题目: Given an array of integers, find out whether there are two distinct indices i and j in the array ...