python函数的 全局变量与局部变量

一、函数的全局变量

1、什么是全局变量

顶着头开始写,没有任何缩进,在py文件的任何位置都能调用

#!/usr/bin/env  python
# _*_ coding:utf8 _*_
name="gouguoqi"name="gouguoqi"
def change_name():print ("111",(name))  #这里的name就是调用的全局变量
change_name()C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py111 gouguoqi

 

2、全局变量与局部变量的区别

name="gouguoqi"
def change_name():name="miaoye"   #局部变量print ("111",(name)) #这打印的是局部变量
change_name() #这里函数调用的是局部变量的name
print (name) #这里是是调用的函数外面的全局变量

C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py111 miaoyegouguoqi

3、global  关键字。想要在函数里面修改全局变量应该如何做

global name,就代表调用全局的变量name

专业的说法是global 后面的name是一个指针,一个内存地址,直接调用的那个内存地址

调用之后在子程序(局部程序)里面再次给name赋值的话就修改了全局变量name了

name="gouguoqi"
def change_name():global namename="miaoye"print ("111",(name))
change_name()
print (name)C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py111 miaoyemiaoye

 

全局作用域是全局

局部作用于是局部

变量调用的顺序是先找局部作用域,如果找不到,再往外层找,然后在找全局作用域

4、人性化的描述全局变量和局部变量

我们把全局变量当做是一个盒子,局部变量是这个盒子里面的小盒子。这些小盒子是同一个级别的,当程序运行的时候,是从上到下的运行方式,碰到函数之后,先不运行,继续往下走,直到调用函数的时候,才打开函数的子程序进行赋值运行然后出结果

当自己的盒子里面没有要寻找的变量的时候,就去盒子外面找,外面没有,再去全局找

 

如果函数内部没有globe关键字,优先读取局部变量,能读取全局变量,无法对全局变量重新赋值,但是对于可变类型,可以对内部元素进行操作,可以append

如果函数中有golobe关键字,变量本质上就是全局的那个变量,可读取,可重新赋值

 

(4).1  如果函数中无global关键字,优先读取局部变量,能读取全局变量,无法对全局变

量重新赋值,但是对于可变类型,可以对内部元素进行操作,可以append remove clear

如果声明了局部变量,就调用局部变量

如果没有声明局部变量,就会调用全局变量

name="苍老师"  #这是真正的苍老师肉体
def gou():name = "娃娃"print ("我要搞",name)
def miao():name = ""print ("我要搞",name)def bei():print ("我要搞",name)
gou()
miao()bei()C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py我要搞 娃娃我要搞 基我要搞 苍老师

 

如果变量是一个可变的类型,可以用方法来进行apped  remove  clear

name=["苍老师","波多野吉衣"]
def gou():name.append("")print ("我要搞",name)
gou()print (name)C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py我要搞 ['苍老师', '波多野吉衣', '']['苍老师', '波多野吉衣', '']

(4).2如果函数中有global关键字,变量本质上就是全局的那个变量(指针),可读取,可赋值

在局部子程序调用全局变量(如果只是调用的话相当于做蜡像)

name="苍老师"  #这是真正的苍老师肉体def gou():global name #相当于做了一个苍老师的蜡像,跟本人一模一样print ("我要搞",name)
def miao():name = ""print ("我要搞",name)
gou()
miao()C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py我要搞 苍老师我要搞 基

 

(4).3在局部变量中修改全局变量(修改的话相当于玩过了,感觉不过瘾,就换人了)

name="苍老师"  #这是真正的苍老师肉体
def gou():global name  #相当于玩了苍老师的肉体name = "波多野吉衣"  #感觉不是很好,把苍老师换成了波多野吉衣print ("我要搞",name)
def miao():print ("我要搞",name)#因为上面已经换人了,所以下面这人玩的也是波多野吉衣
gou()
miao()C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py我要搞 波多野吉衣我要搞 波多野吉衣

 

(4.)4  错误示例,局部变量也有name,全局变量也有name,并且全局变量在局部变量下面的位置

代码过程是,首先定义了一个全局变量,在局部子程序首先设置了相同名字的局部变量,再引用了全局变量,然后在去打印的时候,就不知道打印的到底是全局变量还是局部变量了,这样写是不行了,所以以后要养成一个习惯就是global一定要放到上面,再工作中我们定义全局变量最好用大写,局部变量小写,这样下面函数一调用 我们一看是大写的就知道是全局变量了

 

name="gouguoqi"
def change_name():name = "阿猫"global nameprint ("111",(name))
change_name()C:\python35\python3.exe D:/pyproject/day14函数/全局变量和局部变量.py111 阿猫D:/pyproject/day14函数/全局变量和局部变量.py:19: SyntaxWarning: name 'name' is assigned to before global declarationglobal name

 

(4).5函数中嵌套函数

 

函数的执行过程

 

name="北爷"   #1 第一步 定义全局变量name
def huangwei():  #2 第二步 定义一个函数,到49行第二步结束,把这些都放到内存里面加载上,并没有执行name = "黄伟" #4.1  定义局部变量nameprint (name) #4.2 打印局部变量name的值  "黄伟"def liuyang(): #4.3 定义一个函数,然后把这段到47行的代码又放入了内存,等待下次调用name = "刘洋" #4.4.1定义局部变量nameprint (name) #4.4.2打印出局部变量name "刘洋"def nulige():#4.4.3  又遇到def了。又把这一部分到45行的代码放入了内存,没有执行。等待下次调用name = "喵爷"#4.4.5.1定义了一个局部变量nameprint (name)#4.4.5.2打印局部变量name的值"喵爷"print (name)#4.4.4 打印name 刘洋nulige()#4.4.5 调用nulige这个函数,开始向上找liuyang()#4.4 调用liuyang这个函数,开始向上找print(name) #4.5 第五步 打印name 这时候的name的值是"黄伟"
print(name) #3 第三步  打印name 这时候name="北爷"
huangwei() #4 第四步 执行huangwei这个函数,开始向上找他
print(name)#5第五步 打印全局变量name

 

def gou():#1name = ""#2.1print (name)#2.2def mao():#2.3name = ""#2.4.1print (name)#2.4.2def zhu():#2.4.3name = ""#2.5.1.1print (name)#2.5.1.2zhu()#2.5.1print(name)#2.5.2mao()#2.4print (name)#2.5
gou()#2

C:\python35\python3.exe D:/pyproject/day14函数/hanshu.py狗猫猪猫狗

 

Name = "beiye"  #1  定义一个全局变量
def weihou(): #2 把从函数到143行的放入内存中,等待被调用name = "沉着"#4.1 定义一个局部变量name = 沉着def weiweihou(): #4.2 又遇到def  把到141行的代码再次放入内存,等待被调用global Name#4.3.1Name = "冷静"#4.3.2 把全局变量修改为 "冷静"weiweihou()#4.3 调用weiweihou ,开始向上找这个函数print(name)#4.4 打印下这个级别的name 是 沉着
print(Name)#3 打印一下全局变量 Name 等于 beiye
weihou()#4 调用函数 weihou,开始网上找 weihou这个函数
print(Name) #5 打印下全局变量  这时候全局变量是冷静了

C:\python35\python3.exe D:/pyproject/day14函数/hanshu.pybeiye沉着冷静

 

那我要是想修改我上一级的name呢,而不是修改全局的name呢该怎么做呢

nonloca 这个关键字就是修改上一级的变量的,我们来测试下,还是上面的例子,改变下

nonlocal  修改上一级的变量

 

Name = "beiye"  #1  定义一个全局变量
def weihou(): #2 把从函数到143行的放入内存中,等待被调用name = "沉着"#4.1 定义一个局部变量name = 沉着def weiweihou(): #4.2 又遇到def  把到141行的代码再次放入内存,等待被调用nonlocal name#4.3.1name = "冷静"#4.3.2 把上一级的name变量修改为 "冷静"weiweihou()#4.3 调用weiweihou ,开始向上找这个函数print(name)#4.4 打印下这个级别的name 是 沉着
print(Name)#3 打印一下全局变量 Name 等于 beiye
weihou()#4 调用函数 weihou,开始网上找 weihou这个函数
print(Name) #5 打印下全局变量  这时候全局变量是冷静了

C:\python35\python3.exe D:/pyproject/day14函数/hanshu.pybeiye冷静beiye

 

转载于:https://www.cnblogs.com/gouguoqilinux/p/9153381.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#程序将DLL包进EXE方法

有时候我们在发布程序的时候只想发布一个EXE,而编写程序的时候往往会有多个DLL,这个时候如果能把这些DLL装进EXE将是一个很令人振奋的事情,事实上对于C#程序有很多方法如下:1. 使用微软的ILMerge(缺点:不支…

org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI

org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI 在重启项目中会遇到[org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [*********] in DispatcherServlet with name SpringMVC 这个…

spring本地化默认英文_Spring3国际化和本地化

spring本地化默认英文我最近想将Spring 3提供的国际化和本地化功能添加到我当前的项目之一中。 我浏览了Spring文档,然后在Internet上搜索以找到一些资源。 但是我找不到能够满足客户要求的资源。 大多数教程都像hello world应用程序,它提供了基本的理解…

我所知道的Ribbon库

QT: http://www.devmachines.com/qtitanribbon-overview.html http://qribbon.sourceforge.net MFC、c#可以到微软官方下载 System.Windows.Forms.Ribbon35.DLL - Type: Managed DLL - An Open Source Ribbon Control for .NET WinForm - Read more: http://…

JUnit 5 –动态测试

在定义测试时,JUnit 4有一个很大的弱点:它必须在编译时发生。 现在,JUnit 5将解决此问题! Milestone 1 刚刚发布 ,并带有全新的动态测试,该动态测试允许在运行时创建测试。 总览 本系列中有关JUnit 5的其他…

win8.1自带metro应用不工作解决办法

输入如下命令 powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\WinStore\AppxManifest.XML powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\Im…

python基础-网络基础知识和网络编程

之前对这一块的知识,总是记不住,这次正好有系统的学习,所以决定好好的梳理一下 1. 计算机网络基础知识 1.1 互联网协议和OSI模型 *协议模型互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层,如下图所示 *每层运行常见物理设备 *每层运行常见的协议 1.2 基础网络概念…

HDU 1999 不可摸数

不可摸数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5334 Accepted Submission(s): 1405 Problem Descriptions(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)1234616.如果任…

C语言返回文件大小的功能(fseek和ftell的使用)

需求:有时候读文件时,需要知道文件的字符总的个数,可能是为了提前定义缓冲区大小或者拷贝文件等等。也可以用于动态创建数组。在进行这两个问题之前,先来了解一下两个函数,这两个函数配合就能够实现计算大小的功能。函…

自定义相册、九宫格显示图片

一 自定义相册 结合Glide图片库,加载显示本地图片,并可以实现单选,多选,预览功能。特点 加载最近新增图片,GridView显示分文件夹选择图片支持单选,多选(最大9张)支持大图预览以库的形…

设计一代码,逆置带头结点的动态单链表L

有两种方法&#xff1a; 一是&#xff1a;用头插法建立单链表&#xff0c;自然而然就实现了逆置的动态链表。 代码&#xff1a; #include<stdio.h> #include<malloc.h> typedef int datatype; typedef struct node {datatype data;struct node * next; }linklist…

dll生成lib

来自http://suddymail.org/show-160-1.html没有尝试过&#xff0c;仅供参考。其他链接&#xff1a;http://hi.baidu.com/songxiuying/item/af67755203840f948d12ed6d为无LIB的DLL制作LIB函数符号输入库 本文介绍了在VC中针对无LIB时的DLL隐式链接,制作可供VC使用的LIB函数符号…

maven使用junit3_JUnit,Logback,带有Maven 3的Maven

maven使用junit3在本系列中&#xff0c;我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的话题了。 但是&#xff0c;在我们涉足更深的领域之前&#xff0c;让我们先进行一些基础设置。 单元测试 我不是TDD传播者。 我在…

LeetCode(90):子集 II

Medium&#xff01; 题目描述&#xff1a; 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [[2],[1],[1,2,2],[2,2],[1,2],[] ] 解题思路&…

MFC程序在其他机器运行

为了保证MFC程序能够在没有安装VS的机器上运行&#xff0c;可以采用如下方法。1. 单个的小程序&#xff0c;可以静态编译MFC&#xff0c;但不适用于有很多dll的工程。2. 拷贝VS安装目录Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.MFC下的4个文件和Microsoft …

ACM搜索题目总结

ACM搜索题目总结 格式说明&#xff1a;题目名后面列出个人此题的大致难度&#xff08;对菜鸟而言&#xff09; POJ 1069 -The Bermuda Triangle(难) http://acm.pku.edu.cn/JudgeOnline/problem?id1069 题意&#xff1a;用给定三角型填充六边形 解法&#xff1a;此题的思想上精…

JPA中按身份引用

在上一篇文章中 &#xff0c;我提到我选择通过其主键而不是类型来引用其他聚合。 在处理大型或复杂域模型时&#xff0c;我通常使用这种方法&#xff08;也称为断开域模型&#xff09;。 在这篇文章中&#xff0c;让我尝试进一步解释如何在JPA中完成它。 请注意&#xff0c;生成…

在idea下开发出现404错误

用idea开发时&#xff0c;我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources&#xff0c; Excluded。 同时也可以在maven的pom里面build标签里设置。 <resource><directory>src/main/webapp</directory&g…

MFC利用控制台输出调试信息的方法

VS2010中只要输入以下信息即可&#xff1a;editbin /SUBSYSTEM:CONSOLE $(OUTDIR)$(TargetName).exeVC6.0稍微复杂&#xff1a;打开菜单“Project”-“Setting”&#xff08;或者Alt-F7&#xff09;&#xff0c;打开选项卡“Post-builder step”&#xff08;Post-build步骤&…

一念成佛,一念成魔

一念成佛&#xff0c;一念成魔 前几天&#xff0c;因我与寝友的一次错误导致电脑系统崩溃&#xff0c;连开机都开不了了。可我发现我并不是很生气&#xff0c;只是用玩笑话调侃了他一下。后来想想&#xff0c;要是放在以前&#xff0c;我一定会大发脾气&#xff0c;几天都不去理…