Python全局变量和局部变量(超详细,纯干货,保姆级教学)
全局变量定义:
在函数外部定义的变量。所有函数内部都可以使用这个变量。
局部变量定义:
在函数内部定义的变量。这个变量只能在定义这个变量的函数内部使用。
第一种:global定义全局变量在自定义函数内部
定义看起来一愣一愣的,没关系我也是。我将会用实例的方式为你解释。我们也知道在Python中有一个global关键字用来声明一个全局变量。那这玩意儿到底什么用。来看看
def first():global keykey="first()的key"print("进入first函数,给key赋新值,此时print(key)得到***"+key+"***\n")
def second():print("进入second函数,但是没有给key赋新值,此时print(key)得到***"+key+"***\n")
def third():key="third()的key"print("进入third函数,给key赋新值,此时print(key)得到***"+key+"***\n")first()
second()
third()
print(key)
******最后的到运行结果如下******
结论:上面例子说明了 global 定义 全局变量,就是用在 自定义函数 内部,用于告诉python这是一个 全局变量 .作用跟在 全局作用域 里写下一个 全局变量a 是一样一样的效果
(注意,我可没在全局定义key,但是可以打印出来,这说明了什么???严格证明了结论嘛)
**********************分割线***************************
第二种:全局定义全局变量,并给其赋值。
(注:在全局内写“key="值"相当于在全局内写“global key
key="值"”)
key="全局内定义,并赋值的全局变量key"def first():key="first()局部新定义的“全局key“"print("进入first函数,key的值为***"+key+"***\n")
def second():print("进入second函数,在second函数内部,不赋给key新值,引用first()函数后的key为***"+key+"***\n")print("没有引用first()函数时的key为***"+key+"***\n")#为了先print出key的全局内定义的 全局变量值first()#first()函数内部对全局内定义的 全局变量key 进行了赋值。实质上是在first()内部定义了一个局部变量second()#验证这个 first()内部定义的局部变量会不会影响到second()中的key。(就像第一种global key那样。结论当然是否定的。但我们这里验证一下,消除一下读者的疑问)print("引用first()函数后的key为***"+key+"***\n")#验证在 first()定义了一个局部变量之后,会不会影响到全局内的全局变量key。(答案当然也是否定的,这里这一步也是为了消除读者的疑问)
********运行结果如下********
可见,以上例子中。first()内定义了一个局部变量,然后出了这个first()函数以后,这个变量便消失,不可再用。同时也体现了“局部变量>全局变量”的优先级关系。
结论:在全局 定义 全局变量 key 后,自定义函数 内部 再对这个 key 进行定义 的时候,就是定义了 key局部变量,出了这个 自定义函数,便不可再用。下一个自定义函数 只能用 全局变量key 了。
**********************分割线***************************
第三种:前两种的混用
def first():key="first()局部新定义的\"局部变量\"key"print("进入first函数,key的值为***"+key+"***\n")
def second():print("进入second函数,在second函数内部,不赋给key新值,引用first()函数后的key为***"+key+"***\n")
def third():global keykey="third()定义的全局通用(即全局变量)global key"print("进入third函数,在third函数内部,赋给key新值,且为global,引用third()后的key为***"+key+"***\n")key="全局内定义,并赋值的全局变量key"
print("没有引用first()函数时的key为***"+key+"***\n")#与第二种的这个位置的作用一样
first()#与第二种的这个位置的作用一样
second()#与第二种的这个位置的作用一样third()#由于我们给third()内部定义了一个global key,探测一下等下再调用third()的时候,我们的全局key会不会改变为third()中的key值。即 第一种 的结论。(当然哈,肯定是会的,证明见下一步)print("引用third()函数后的,全局内的key为***"+key+"***\n")#探测一下global key会不会影响 全局内的key(答案是会影响,因为我们第一种说过。在局部变量里面global key相当于在全局作用域里直接写一个key一样的效果。)
********运行结果如下********
OK,现在严格证明了结论一和结论二.
第四种.深入的了解一下.(必看!!!!!!!!!)
c语言大家都学过吧,没学过也没关系.你回想一下,我们写的第一个hello world程序是不是下面这样
#include<stdio.h>
int main()
{printf("hello world");
}
注意到没有,我们写的第一个c语言程序就是在main()函数内部写的,根据定义,在函数内部写的就是局部变量,当然main()函数也是函数.
然而我们在python中写的第一个hello world是
print("hello world")
这个python的hello world是在哪里写的?没错,在全局作用域里面.而不是在函数内部写的.
根据上面的我说过的
局部变量与全局变量的理解方法
a=1def good(): #定义一个good函数,自定义函数内部的是局部变量a=2 #局部变量a=2print(a) #print结果是2
good() #调用good()函数
print(a) #print结果是1
解释:
在全局作用域中定义了一个全局变量a并赋值为1
后来定义了一个good()函数,作用是给局部变量赋值为2,并print这个a
然后调用这个good()函数:
理解一下.这个名字为a的变量在good()函数中,变量a被自定义函数内部的a=2给赋了一个新的值2,所以a的值由1变成了2.然后执行了print()功能.最后这个函数是不是就调用完成了,然后python就把这个函数的局部变量(也就是a=2)的内存释放(其实也会将参数释放掉,但是我这个函数没有写参数)掉了...所以全局变量a的值又恢复为了1.(最好这样理解,帮你记得更清晰一点,你就按我这样理解)
其实别总是死记硬背什么"在自定义函数内部优先级:局部变量>全局变量"这些全是二级结论,你要懂得本质.为什么在自定义函数内部有这样的优先级?其实不就是因为程序运行到自定义函数内部了,又遇到了同名的变量,然后给这个变量又赋了一个新值嘛..这和你在全局作用域内见到
a=1
a=2
不是一样的嘛...全局变量a先被赋值为了1,之后程序运行到了第二行,遇到了同名的变量a,并给他赋了一个新值为2.这个逻辑其实和我上面紫色标记的内容一样嘛.编程内部逻辑不难,重要的是要理解..然后第二个二级结论就是.局部变量不可以改变全局变量,,为什么?我接着上面紫色标记的内容继续说,其实不就是因为,这个自定义函数调用完之后,他的局部变量被释放掉了嘛.所以,局部变量影响不了全局变量.把上面蓝色标记的内容好好看看,你品,你细品.全局变量,局部变量,听着可高级是吧,其实就是名字听着nb一点,但本质都是一群小趴菜,微不足道,轻轻松松好吧...
为什么要有global?
你想想啊,如果函数内部的局部变量不能改变全局变量肯定是不行的吧,因为总会有情况需要的..
so,这时候global就来了.他的作用是什么呢?是为了告诉python解释器说,我在自定义函数内部global a,相当于在全局作用域里面写一个全局变量a...因此呢,不就可以实现在自定义函数内部也可以改变全局变量的作用啦吗?
兄弟们,好好看看我新更新的内容,你一定受益匪浅!!!!!!!!!!
(如有不足或错误,敬请指正)
Python全局变量和局部变量(超详细,纯干货,保姆级教学)相关推荐
- 在阿里云购买Linux服务器,配置宝塔环境,全图文,最最详细图解,保姆级教学
在阿里云购买Linux服务器( CentOs 7 ),配置宝塔环境 一.在阿里云购买CentOs服务器(Linux系统) CentOS是免费的.开源的.可以重新分发的开源操作系统 ,CentOS(Co ...
- 【无标题】【2023最新版】超详细Sqlmap安装保姆级教程,SQL注入使用指南,收藏这一篇就够了
一.sqlmap简介 sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入.目前支持的数据库有MySql.Oracle.Access.PostageSQL. ...
- MongoDB超详细教程(保姆级)
MongoDB 一.简介 1. 简单介绍 MongoDB是一个基于分布式文件存储的数据库 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非 ...
- 【2023最新版】超详细NMAP安装保姆级教程,Nmap的介绍、功能并进行网络扫描,收藏这一篇就够了
简介 从诞生之初,Nmap就一直是网络发现和攻击界面测绘的首选工具.从主机发现和端口扫描,到操作系统检测和IDS规避/欺骗,Nmap是大大小小黑客行动的基本工具. 为了绘制网络拓扑图,Nmap的发送特 ...
- Github如何使用详细介绍(保姆级教学)
前言
- python变量作用域图解_图解python全局变量与局部变量相关知识
这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解 ...
- Python 全局变量和局部变量
这篇文章主要介绍了Python 全局变量和局部变量,命名空间的概念的提出是为了划分和控制变量是否可见,以及生存周期的长短:命名空间的作用范围叫做作用域更多详细内容需要的小伙伴可以参考一下 1.命名空间 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
最新文章
- 你和区块链的距离就差这篇文章!
- 用jQuery预加载图像
- 初探swift语言的学习笔记五(线程)
- jsapi支付签名_微信支付JSAPI:商户签名错误
- 获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表
- IDEA添加mybatis-mapper的模板
- 周鸿祎为何忘不掉搜索?
- Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想
- ADO.NET学习笔记--索引Index
- 14届数独-真题标准数独-Day 8-20220123
- 初探华尔街期权量化交易的奥秘
- 【转】地址线和数据线的计算
- 【转】论文阅读理解 - Panoptic Segmentation 全景分割
- 膜态沸腾UDF【转载】
- 联想拯救者新款 R9000X价格是多少 配置强不强
- 关于生僻字乱码的问题
- 2022年最新山东建筑八大员(市政)模拟考试题库及答案
- IPsec中IKE与ISAKMP过程分析(主模式-消息5和消息6)
- 【i学堂】PPT美化
- 如何使用MATLAB绘制实时温度图