(十六)python 3 全局变量局部变量
全局变量和局部变量
全局变量与局部变量两者的本质区别就是在于作用域。
用通俗的话来理解的话,全局变量是在整个py文件中声明,全局范围内都可以访问。局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了。
- 在子程序中定义的变量称为局部变量,只在子程序内部生效,
- 在程序一开始定义的变量称为全局变量
- 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
- 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用
global 关键字定义全局变量
name = "xixi" # 全局变量 def change_name():
name = "haha" # 局部变量只在函数局部作用域内生效
print("我的名字", name)
return change_name() # 调用函数时,打印函数内的局部变量name print(name) # 打印的是全局变量name def me():
global name # 声明name是全局变量 global
name = "yj" # 修改name全局变量的值
print(name)
return me() # 调用函数时打印的变量name是被修改过的全局变量
print(name) 结果如下: #我的名字 haha
#xixi
#yj
#yj
如果全局变量是可变的数据类型,函数可以对全局变量内部直接进行修改
eng = ["merry", "jack", "petter"] def chang():
eng.append("mali")
print(eng)
return eng chang() #调用函数时,执行了append() #结果:
['merry', 'jack', 'petter', 'mali']
总结:
一般写程序变量的命名规则
###全局变量变量名大写
###局部变量变量名小写
- 函数优先读取局部变量,能读全局变量,无法对全局变量重新赋值操作,#全局变量是不可变的类型
- 全局变量是可变类型,函数可以对全局变量进行操作
- 函数中有global关键字,变量本质就是全局变量,可读取全局变量,也可操作全局变量
nonlocal关键字
关键字nonlocal,字面意思就是指当前的这个变量不是局部变量,用来在函数或其他作用域中使用外层(非全局)变量。。nonlocal是Python3.0中新增的关键字,python2.x不支持
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter def make_counter_test():
mc = make_counter()
print(mc())
print(mc())
print(mc()) make_counter_test() #输出结果
1 2 3
def scope_test():
def do_local():
spam = "local spam" # 此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错 def do_nonlocal():
nonlocal spam # 使用外层的spam变量
spam = "nonlocal spam" def do_global():
global spam
spam = "global spam" spam = "test spam" #第一步,定义外层函数变量赋值为“test spam”,生命周期在scope_test()内部,相对三个内部函数是个外部变量
do_local() #第二步,调用内部函数定义变量spam=“local spam”,生命周期仅在do_local()内,此处仅定义并赋值而已。
print("After local assignmane:", spam)#第三步:do_local()调用完成函数内spam失效,此处无法访问,打印同级spam="test spam"
do_nonlocal()#第四步,调用do_nonlocal(),并通过nonlocal对外层spam="test spam" 重新赋值spam = "nonlocal spam"
print("After nonlocal assignment:", spam)#第五步,打印spam = "nonlocal spam"
do_global()#第六步,调用do_global(),通过global定义spam全局变量,作用范围在scope_test()外
print("After global assignment:", spam)#第七步,打印scope_test()内部变量spam,但此时spam已被第四步重新赋值为"nonlocal spam" scope_test()#调用函数会按如止步骤执行 print("In global scope:", spam) #执行此处前,scope_test()执行完毕,其内部spam生命周期结束,但第六步,定义生成的全局变量依然存在,在此处会被输出 #输出结果: After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
(十六)python 3 全局变量局部变量的更多相关文章
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- 十六. Python基础(16)--内置函数-2
十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中
前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...
- 三十六 Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码
scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开源模块 scrapy-redis的依赖 Python 2.7, 3.4 or 3.5,Python支持版本 Redis & ...
- 二十六 Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理
downloadmiddleware介绍中间件是一个框架,可以连接到请求/响应处理中.这是一种很轻的.低层次的系统,可以改变Scrapy的请求和回应.也就是在Requests请求和Response响应 ...
- Python核心技术与实战——十六|Python协程
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...
- python学习笔记(十六)-Python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
随机推荐
- 莫队初探(不带修/例题极少)By cellur925
因为今天考到莫队裸题了嘤嘤嘤...而我这样的蒟蒻肯定不会这样的高端算法啊QAQ.于是暴力水了40分qwq. 正如上文所说,我实在太菜了,于是学习莫队也只是学习了最简单的不带修普通莫队,如果我能苟到省选 ...
- OLE/COM Object Viewer
OLE/COM Object Viewer摘AutoIt Help The "OLE/COM Object Viewer" is a very handy tool to get ...
- Java | 基础归纳 | Gson && Json
JSON: JSON就是一种数据的组织形式,用于数据传输. 地址:https://mvnrepository.com/artifact/net.sf.json-lib/json-lib/2.4 Mav ...
- AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...
- Hdu 2888 Check Corners (二维RMQ (ST))
题目链接: Hdu 2888 Check Corners 题目描述: 给出一个n*m的矩阵,问以(r1,c1)为左上角,(r2,c2)为右下角的子矩阵中最大的元素值是否为子矩阵的顶点? 解题思路: 二 ...
- POJ3417(树上差分)
会卡vector. ; int n, m, Ans; ], to[maxn * ], tot; int vis[maxn], f[maxn]; int d[maxn], sum[maxn]; vect ...
- Mysql的外键
概念:如果一个实体A的某一字段,刚好指向或引用另一个实体B的主键,那么实体A的这个字段就叫作外键,所以简单来说,外键就是外面的主键,就是其他表的主键. 例: 以上的学生表的班级字段,就是一个外键! 其 ...
- Vijos p1688 病毒传递 树形DP
https://vijos.org/p/1688 看了下别人讨论的题解才想到的,不过方法和他的不同,感觉它的是错的.(感觉.感觉) 首先N只有1000, 如果能做到暴力枚举每一个节点,然后O(N)算出 ...
- #219. 【NOI2016】优秀的拆分
如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A=aabA=aab ...
- 【转】Android官方架构项目之MVP + Clean
首先,不了解 Clean 架构的可以看看这个,不过也没关系,阅读本文后你也许会对Clean架构思想有一个认识. 对比MVP项目的结构图,我们发现不同之处是新增的这个Domain Layer这层,来隔离 ...