全局变量和局部变量

全局变量与局部变量两者的本质区别就是在于作用域。

用通俗的话来理解的话,全局变量是在整个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']

  

总结:

一般写程序变量的命名规则

###全局变量变量名大写

###局部变量变量名小写

  1. 函数优先读取局部变量,能读全局变量,无法对全局变量重新赋值操作,#全局变量是不可变的类型
  2. 全局变量是可变类型,函数可以对全局变量进行操作
  3. 函数中有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 全局变量局部变量的更多相关文章

  1. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  2. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  3. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  4. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

  5. 三十六 Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码

    scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开源模块 scrapy-redis的依赖 Python 2.7, 3.4 or 3.5,Python支持版本 Redis & ...

  6. 二十六 Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理

    downloadmiddleware介绍中间件是一个框架,可以连接到请求/响应处理中.这是一种很轻的.低层次的系统,可以改变Scrapy的请求和回应.也就是在Requests请求和Response响应 ...

  7. Python核心技术与实战——十六|Python协程

    我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...

  8. python学习笔记(十六)-Python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  9. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

随机推荐

  1. 伪元素选择器:before 以及 :after

    E:after.E:before 在旧版本里是伪类,在新版本里是伪元素,新版本下E:after.E:before会被自动识别为E::after.E::before,按伪元素来对待,这样做的目的是用来做 ...

  2. JAVA学习笔记(一)配置环境

    java语言的两种机制: Java 的虚拟机机制(JVM):虚拟机机制保证Java程序的跨平台特性. Java 的垃圾回收机制:垃圾回收机制保证Java程序更安全.更高效. 环境搭配:安装JDK和JR ...

  3. 高阶组件(Higher-Order Components)

    有时候人们很喜欢造一些名字很吓人的名词,让人一听这个名词就觉得自己不可能学会,从而让人望而却步.但是其实这些名词背后所代表的东西其实很简单. 我不能说高阶组件就是这么一个东西.但是它是一个概念上很简单 ...

  4. AS 开发环境配置

    安装时不用设置代理(proxy). 建议选择标准安装,自定义安装容易选掉一些功能.插件. SDK Tools里的(HAXM installer)有时会未安装,安装完需检查(HAXM installer ...

  5. Kotlin学习的一些笔记

    Introduction 写在前面 关于本书 这本书适合你吗? 关于作者 介绍 什么是Kotlin? 我们通过Kotlin得到什么 准备工作 Android Studio 安装Kotlin插件 创建一 ...

  6. Ubuntu 创建docker 容器 系列一

    docker 官网安装地址:https://docs.docker.com/install/linux/docker-ce/ubuntu/ 1.Ubuntu的版本要在12.04 LTS 以上,使用un ...

  7. 初识Vivado

    Vivado 设计套件包括高度集成的设计环境和新一代从系统到 IC 级的工具,这些均建立在共享的可扩展数据模型和通用调试环境基础上.这也是一个基于 AMBA AXI4 互联规范.IP-XACT IP ...

  8. Git搭建自己的网站服务器(Linux)

    git服务器弄了半天终于搞定了,还是记录下吧,不然下次有得忘了 流程: 服务器 构建git目录 git用户,git组作为仓库管理 ssh授权(远程无需密码接入) hook(post-receive)自 ...

  9. 应用程序员眼中的数据库管理系统:API+数据库语言

    应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html

  10. element-ui date-picker 设置结束时间大于等于开始时间且开始时间小于等于结束时间

    Part.1  问题 date-picker 组件在使用时,默认对时间是没有限制的,可以随便选择区间,官方文档添加了快捷选项,如:一周丶一月... 但是从用户体验方面出发,我们还是希望对时间进行有利的 ...