python中全局变量和局部变量的一个小坑
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中全局变量和局部变量的一个小坑的更多相关文章
- python中全局变量和局部变量
例1: a = 100 #定义全局变量a def test1(): print(a) #此处a为全局变量 def test2(a):#此处a为局部变量 print(a)#此处a为局部变量 test1( ...
- js中全局变量和局部变量以及变量声明提升
javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102 收藏 展开 [javascript] view plain copy ...
- PHP和JS中全局变量和局部变量
一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...
- Python 中全局变量的实现
一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...
- mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会
<property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...
- go的变量redeclare的问题,golang的一个小坑
go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int 然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- 关于sniff函数的一个小坑
最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.
随机推荐
- C++之const限定符
作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...
- Ubuntu17.04配置LNMP(Nginx+PHP7+MySQL)简单教程 快速 易学 简单易懂
我安装的是当前最新的Ubuntu版本17.04,在虚拟机中先试用一下,如果没有什么不稳定的现象,准备以后作为主力操作系统 Ubuntu属于Debian系的Linux系统,拥有着一个很NB的软件包管理器 ...
- .net 4.0 中的特性总结(二):默认参数、命名参数
1.在方法定义的时候为参数指定一个默认值.调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里.例如: 2.在之前版本的C#中,方法定义的参数顺序必须与方法调 ...
- Redis客户端管理工具,状态监控工具
TreeNMS是一款Redis web客户端管理工具,采用JAVA开发,实现基于web方式对Redis数据库进行管理.监控.数据维护. 功能包括:数据库的状态监控,库表的展示,key,value的展示 ...
- 愚公oracle数据库同步工具
最近,利用一些时间对oracle数据库实时同步工具做了一些调研分析,主要关注了linkedin的databus和阿里的yugong两个中间件,其中databus需要在每个待同步的表上增加额外的列和触发 ...
- hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性
// hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...
- select onchagnge 弹出自己的文本值
select onchagnge 弹出自己的文本值onchange='alert($("option:selected",this).text())'
- 在React中使用Redux
这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...
- java对mysql的增删改查
-----连接数据库 package connectdb;import java.sql.*;class Dbcon { // 此处连接数据库,独立开一个类,以后操作数据库的每次连接就不用写这么多 p ...
- Swift开发常用知识点
#pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...