• 掌握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 全局变量与局部变量 垃圾回收机制的更多相关文章

  1. python之MRO和垃圾回收机制

    一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...

  2. Python的 垃圾回收机制

    垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...

  3. python里面的垃圾回收机制

    文章链接:https://www.jianshu.com/p/1e375fb40506 Garbage collection(GC) 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c ...

  4. Python垃圾回收机制--完美讲解!

    转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...

  5. python垃圾回收机制(Garbage collection)

    由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...

  6. python高级:垃圾回收机制

    ---恢复内容开始--- 垃圾回收机制 1.计数引用机制 就是一个变量.数据结构.对象当没有人引用时,python的会启用垃圾回收机制,将其从内存中删除. 怎么看引用的次数呢?sys模块提供的sys. ...

  7. 浅析Python垃圾回收机制!

    Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...

  8. 简述Python垃圾回收机制和常量池的验证

    目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...

  9. JavaScript巩固篇(一)——数据类型与全局变量、局部变量、垃圾回收机制、存储方式、生命周期

    知识要点 数据类型 存储方式 全局变量与局部变量 变量的生命周期 垃圾回收机制 知识概览 数据类型 JavaScript的数据类型分为:基本类型.引用类型 本质区别: 基本数据类型的变量实际值存储在栈 ...

随机推荐

  1. 一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?

    摘要:近日,华为云数据库业务总裁苏光牛在ACMUG中国MySQL用户组主办的 "华为云专场" 技术沙龙中分享了华为云数据库重磅新品GaussDB的核心能力与竞争优势.那么, Gau ...

  2. 【惊喜】Github爆火的java面试神技+java核心面试技术已开发下载,大厂内都传疯了!

    前言 今年,由于疫情的影响,很多互联网企业都在缩减招聘成本.作为程序员,原本这两年就面临竞争激烈.年龄危机的问题,而现在的求职局面又完全是企业在挑人的状态. 所以最好能在空闲的时候看看大厂相匹配的技术 ...

  3. 2020阿里,字节跳动,JAVA岗(一线企业校招、社招)面试题合集

    前言 以下面试题全属于一线大厂社招以及校招的面试真题,各位在做这些题目对照自己的时候请平凡心对待,不要信心受挫.其实 做为致力于一线企业校招或者社招的你来说,能把每个知识模块的一小部分问题去深入学习和 ...

  4. 厉害啊!第一次见到把Shiro运行流程写的这么清楚的,建议收藏起来慢慢看

    前言 shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖 ...

  5. 使用Camtasia来消除视频中的声音

    大多数情况下,我们在录制电脑屏幕的时候都会把音频输出也一起录制下来,但也会有时候要后期进行重新配音,需要把事先一同录制的音频消除掉,今天小编来给大家说一说如何消除这种的视频声音. 首先打开Camtas ...

  6. gitlab private-token利用工具

    在渗透测试中,经常会遇到只获得gitlab PRIVATE-TOKEN的情况,而gitlab提供了一系列的api给我们通过这个token去访问gitlab. 所以做了个简单的gitlab工具,以供紧获 ...

  7. js 手机号验证

    1 js 通过正则表达式对手机号进行验证 2 3 var reg = /^1[3|4|5|8][0-9]\d{4,8}$/; 4 var sMobile = document.mobileform.m ...

  8. influxdb的基本使用

    influxDB名词 database:数据库: measurement:数据库中的表: points:表里面的一行数据. influxDB中独有的一些概念 Point由时间戳(time).数据(fi ...

  9. 记 · ElemetnUI + Vue v-if 视图切换踩过的那些坑

    使用EleUI 做一个用户登录窗口,需要用v-if 动态切换三个表单:手机登录.账密登录和密码找回.其中需要实现一个重置表单的功能,但其间出了一些小bug.密码找回表单中有三个表单项,手机登录和账密登 ...

  10. P2943 [USACO09MAR]Cleaning Up G

    一句话题意:将一个数列分成若干段,每段的不和谐度为该段内不同数字数量的平方,求不和谐度之和的最小值. 令 \(f_i\) 表示前 \(i\) 个数的最小答案,很容易就能写出暴力转移方程:\(f_i=\ ...