python 局部变量 占内存吗

编程入门 行业动态 更新时间:2024-10-07 01:31:39

python 局部<a href=https://www.elefans.com/category/jswz/34/1771380.html style=变量 占内存吗"/>

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 局部变量 占内存吗

本文发布于:2024-02-28 08:45:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768933.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:变量   局部   内存   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!