python 全局变量与局部变量 垃圾回收机制
掌握L、E、G、B(作用域)
掌握局部作用域修改全局变量
步骤-
1.命名空间和作用域
命名空间:变量名称与值的映射关系
作用域:变量作用的区域,即范围。
注意:class/def/模块会产生作用域;分支语句,循环语句,异常处理语句不会产生新的作用域。
2.作用域的类型区分
| 分类 | 表示 | 简单写法 |
|---|---|---|
| 局部作用域 | Local | L |
| 嵌套作用域 | Enclosing | E |
| 全局作用域 | Global | G |
| 内置作用域 | builtin | B |
# 全局变量
name = "小张" # 全局作用域
def fun():
# 嵌套作用域
age = 20
def fun02():
print("xxxx")
# print内置作用域内
print(name)
练习:定义一个包含四个作用域变量的代码块,并明确说出他们的变量作用域类型。
# 说出变量的作用域
a = 1 # 全局作用域
def sum_num():
c = 2 # 嵌套作用域
def inner():
d = 3 # 局部作用域
print(d)
print(c)
# 内置作用域
print(a)
3.LEGB法则
局部 > 嵌套 > 全局 > 内置
4.局部作用域变量的特点
局部变量只能在局部访问
def fun():
a = 10
print(a)
fun()
函数运行,开辟栈帧,在函数栈帧存活期间,访问局部变量,可以访问得到,如果函数栈帧销毁,则所有数据对象销毁。
5.局部作用域内修改全局变量
需要在局部作用域内生命全局变量
5.1 可变类型
list01 = [1, 2, 3, 4, 5, 6]
def fun01():
# global 声明
list01.append(0)
print(list01) # [1, 2, 3, 4, 5, 6, 0]
fun01()
print(list01) # [1, 2, 3, 4, 5, 6, 0]
5.2 不可变类型
a = 10
def fun():
# 在局部作用域修改全局变量
# 兄弟,我这里声明的是一个全局变量
global a # 声明在局部作用域内创建一个全局变量
a = 20
print(a) # 20
fun()
print(a) # 20
6.总结
- 命名空间与作用域
- 作用域类型:LEGB
- LEGB法则
- 局部作用域内修改全局变量
- 可变类型:直接修改
- 不可变量:global
在局部修改全局的:global
在局部修改嵌套的:nonlocal
当在局部作用域内修改全局变量时,如果全局变量为不可变类型,需要使用global 生命全局变量,才可以修改;如果全局变量为可变类型,可以直接修改。
命名空间:变量名称和值的映射关系
作用域:作用域就是变量作用的区域,即范围
作用域种类:
局部作用域(Local)
嵌套作用域(Enclosing)
全局作用域(Global)
内置作用域(Builtin)
LEGB法则:
局部作用域 -> 嵌套作用域 -> 全局作用域 -> 内置作用域
问题导入
有的时候会涉及到函数嵌套,当内存函数需要修改外层函数内的变量值时该怎么办?
步骤
1.nonlocal代码示范
# 嵌套作用域
# 函数嵌套
# 在局部作用域内去修改嵌套作用域内的变量
# 当我们在局部作用域内要修改嵌套作用域内的变量时,需要使用nonlocal去声明
def fun01():
name = "积云教育"
def fun02():
# 在这里不仅仅去访问name变量
# 修改name变量
nonlocal name
name = "积云教育人工智能"
print(name)
fun02()
print("---->",name)
fun01()
2.global 和 nonlocal 的区别
在局部修改全局的:global
在局部修改嵌套的:nonlocal
3.案例演示
name = "北京烤鸭"
address = ["东直门", "西直门", "朝阳区"]
def fun01():
global name
name = "全聚德北京烤鸭"
address.append("国贸")
address.append("西单")
price = 20
def fun02():
nonlocal price
price = 230
fun02()
print("修改后的价格为:", price)
fun01()
print(name)
print(address)
课堂回顾
global:在局部修改全局
nonlocal:局部修改嵌套
问题导入
当python解释器执行创建对象等语句时,会在内存中开辟一块空间存储相关内容,但内存空间有限,当创建很多的对象,开辟很多内存空间,但一直不清理时,内存就会溢出,会产生内存危机。此时该怎么办呢?
1.基础概念理解
内存空间的申请与回收是非常耗费精力的事情,且存在极大的危险性,稍有不慎就有可能引发内存溢出问题,好在 Cpython 解释器提供了自动的垃圾回收机制来帮我们解决了这件事。 Python 的垃圾回收机制 ( 简称GC ) 主要采用的是引用计数为主、标记清除与分代回收为辅的垃圾回收策略
2.引用计数
值被多次引用:不会在内存中重复创建数据,而是引用计数器+1,当对象被销毁时,引用计数器-1,如果引用计数器为0,在内存中进行删除销毁(暂时不考虑其他特殊的情况)。
对象被销毁:
list01 = [1, 2, 3, [4, 5], 6]
list02 = list01
name = "龟叔"
引用计数是Cpython解释器提供的垃圾回收机制中的一种方法
基于引用数据器进行垃圾回收机制还有存在一定的问题。
分析:
执行del操作之后,由于循环引用,所以他们的计数器不会为0,因此,引用计数,失效。
3.标记清除
为了解决循环引用的问题,我们引入了标记清除,只针对那些可能才在循环引用的对象,进行特殊处理,例如:列表、元组、字典、集合。
当这些类型中引入另外一个,并且只有他们互相引用,那么就给标记清除。
4.分代回收
对标记清除要进行优化,将那些可能存在循环引用的对象拆分,拆分为3个不同的区域,称为:0/1/2(青年代、中年代、老年代),
0:当区域内对象个数阈值达到700时,才执行一个0代的扫描检查。
1:当0代(青年代)扫描次数超过10次,则执行一个1代稻苗检查
2:当1代(中年代)稻苗次数超过10次后,则执行一次2代的扫价差。
5.总结
- 垃圾回收机制(GC机制)
- 以引用计数为主,标记清除和分代回收为辅
python 全局变量与局部变量 垃圾回收机制的更多相关文章
- python之MRO和垃圾回收机制
一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...
- Python的 垃圾回收机制
垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...
- python里面的垃圾回收机制
文章链接:https://www.jianshu.com/p/1e375fb40506 Garbage collection(GC) 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c ...
- Python垃圾回收机制--完美讲解!
转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...
- python垃圾回收机制(Garbage collection)
由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...
- python高级:垃圾回收机制
---恢复内容开始--- 垃圾回收机制 1.计数引用机制 就是一个变量.数据结构.对象当没有人引用时,python的会启用垃圾回收机制,将其从内存中删除. 怎么看引用的次数呢?sys模块提供的sys. ...
- 浅析Python垃圾回收机制!
Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...
- 简述Python垃圾回收机制和常量池的验证
目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...
- JavaScript巩固篇(一)——数据类型与全局变量、局部变量、垃圾回收机制、存储方式、生命周期
知识要点 数据类型 存储方式 全局变量与局部变量 变量的生命周期 垃圾回收机制 知识概览 数据类型 JavaScript的数据类型分为:基本类型.引用类型 本质区别: 基本数据类型的变量实际值存储在栈 ...
随机推荐
- 如何在苹果电脑下载器Folx中管理下载列表
Folx是一款Mas OS专用的下载器,提供了便捷的下载管理.灵活的设置.今天小编准备跟大家聊一聊关于Folx中常见的几种下载管理方式. 一.管理任务状态栏 在Folx下载面板上,可以通过类别查看任务 ...
- 从这三方面优化你的电脑,保持Mac运行流畅
使用着Mac系统的用户都知道,Mac OS的各方面性能都很好,特别是流畅性,有人说不用清理垃圾也能流畅地使用Mac,但这的确是夸张了.电脑使用的时间长了,它的性能总会越来越退步,这其中有着系统垃圾拖累 ...
- 从本质上学会基于HarmonyOS开发Hi3861(主要讲授方法)
引言:花半秒钟就看透事物本质的人,和花一辈子都看不透事物本质的人,注定是截然不同的命运 做开发也一样,如果您能看透开发的整个过程,就不会出现"学会了某个RTOS的开发,同样的RTOS开发换一 ...
- Python判断是否为数字
前言 Python isdigit()方法检测字符串是否只由数字组成. isdigit()方法语法: str.isdigit() 如果字符串只包含数字则返回 True 否则返回 False. 示例 x ...
- [配置]01.IntelliJ IDEA代码格式化与Eclipse保持风格一致
- iOS中跑马灯效果小结
时光过得好快,记忆中刚刚从春节返回没有多久,清明.五一已飞逝而过,眨眼已到盛夏季节.不过还好,济南这两年不算太热,刚开始升温几天,一场及时雨总能让温度保持适宜.为了纪念一下青春的尾巴,也为了能有个健康 ...
- Java反射说得透彻一些
目录 一.反射机制是什么? 二.反射的具体使用 2.1 获取对象的包名以及类名 2.2 获取Class对象 2.3 getInstance()获取指定类型的实例化对象 2.4 通过构造函数对象实例化对 ...
- 听说高手都用记事本写C语言代码?那你知道怎么编译运行吗?
坊间传闻高手都喜欢用记事本写代码,那么问题来了,我们以C语言为例,如何用记事本编译运行呢?其实最简单的方式就是安装GCC编译器,在记事本编写C语言程序,然后再在命令行用GCC编译运行,下面我简单介绍一 ...
- sharding调试setAutoCommit
emmm应该是有manager的 因为指定了@Primary 不然容器启动的时候创建sessionFactory就因为多个DataSource异常了,后面会滚的时候manager为null也会有运行时 ...
- Debian10快速部署DHCP服务
前言 DHCP(动态主机配置协议)是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码. 进日,想提升一下自己的技术水平,于是就做 ...