网站首页 > 文章中心 > 其它

Python函数销毁

作者:小编 更新时间:2023-09-28 07:59:24 浏览量:419人看过

python命名空间是什么

在Python中,所有的名字都存在一个空间中,它们在该空间中存在和被操作——这就是命名空间.它就像一个盒子,每一个变量名字都对应装着一个对象.当查询变量的时候,会从该盒子里面找到相应的对象.

Python函数销毁-图1

【定义】

名称到对象的映射.命名空间是一个字典的实现,键为变量名,值是变量对应的值.各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响.

【分类】

Local,局部命名空间,每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量.

Global,全局命名空间,每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量.

Built-in,python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常.

【生命周期】

Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除.(每一个递归函数都拥有自己的命名空间).

Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出.

Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出.

各命名空间创建顺序:python解释器启动 -创建内建命名空间 - 加载模块 - 创建全局命名空间 -函数被调用 -创建局部命名空间

各命名空间销毁顺序:函数调用结束 - 销毁函数对应的局部命名空间 - python虚拟机(解释器)退出 -销毁全局命名空间 -销毁内建命名空间

python解释器加载阶段会创建出内建命名空间、模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态的销毁的.

Python函数销毁-图2

Python析构函数

Python中有两个特殊的方法, 一个是构造函数 init , 另一个是析构函数 del ,统称为魔术方法.

构造函数 init ,创建实例对象之后Python会自动执行此方法,把初始化的属性特点放到实例对象里.

构造函数是创建并初始对象属性,那么对象使用完成后,系统是怎么处理这些呢?

这个时候,Python引入了销毁对象功能的析构函数 del ()

析构函数 del 是对象没有被引用时会触发垃圾回收机制,进行内存释放.

python 内置的 del 方法称为析构方法.用于实现对象被销毁时所需的操作.

常见的应用常见如:

析构方法 del ()是可选的,如果不提供,则Python 会在后台提供默认析构函数

如果要显式的调用析构函数,可以使用del关键字: del obj

析构方法的作用是销毁对象的,在python中采用垃圾回收机制.

Python垃圾回收机制核心思想是:

详细说明:

我们主动删除对象调用del 对象;程序运行结束后,python也会自动进行删除其他的对象.

注意:

如果我们重写子类的 del () 方法(父类为非 object 的类),则必须显式调用父类的 del () 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放

我们本期学习了Python内置函数析构函数,用于没有被引用的对象进行回收处理,一般情况下,我们不用刻意去调用,python内部会对进行触发.

好了,全部的本期内容,欢迎大佬们评论区指正,下期见~

如何释放Python占用的内存

象的引用计数减少;

函数运行结束,所有局部变量都被销毁,对象的引用计数也就随之减少.例如 foo(x) 运行结束,x 被销毁;

使用 del 删除一个变量也会导致对象引用减少.例如 del x;

对象从集合对象中移除.例如 lst.remove(x);

包含对象的集合对象被销毁.例如 del lst;

这些操作都可能使对象变成垃圾回收对象,由垃圾收集器负责收集,当然垃圾收集器也负责处理循环引用对象.

要立即释放,可以使用下面的代码

import gc

gc.collect()

请问我的python函数为什么要加return才能正常输出?

因为name这个变量的作用域只在 make_great这个函数的范围内.而不在tt所在的大的函数范围内.一旦make_great这个函数结束了,name这个变量就会被销毁而传递不出makegreat这个函数.这是为什么第一种情况你得到了none.

python线程怎么销毁

【Python】线程的创建、执行、互斥、同步、销毁

虽然每次运行结果是不同,但是可以看得出每次运行结果大抵上是平均的.貌似Python对线程作系统资源的处理,比Java要好.

然而,Python总要实现多线程,代码并不像想象中简单,具体如下:

Python函数销毁-图3

[python] view plain copy print?在CODE上查看代码片派生到我的代码片

import threading;

mutex_lock = threading.RLock(); # 互斥锁的声明

ticket = 100000; # 总票数

# 用于统计各个线程的得票数

ticket_for_thread1 = 0;

class myThread(threading.Thread): # 线程处理函数

def __init__(self, name):

threading.Thread.__init__(self); # 线程类必须的初始化

self.thread_name = name; # 将传递过来的name构造到类中的name

def run(self):

# 声明在类中使用全局变量

global mutex_lock;

global ticket;

global ticket_for_thread1;

while 1:

mutex_lock.acquire(); # 临界区开始,互斥的开始

# 仅能有一个线程↓↓↓↓↓↓↓↓↓↓↓↓

if ticket 0:

ticket -= 1;

# 统计哪到线程拿到票

print "%s抢到了票!票还剩余:%d." % (self.thread_name, ticket);

if self.thread_name == "线程1":

ticket_for_thread1 += 1;

else:

break;

# 仅能有一个线程↑↑↑↑↑↑↑↑↑↑↑↑

mutex_lock.release(); # 临界区结束,互斥的结束

mutex_lock.release(); # python在线程死亡的时候,不会清理已存在在线程函数的互斥锁,必须程序猿自己主动清理

print "%s被销毁了!" % (self.thread_name);

# 初始化线程

thread1 = myThread("线程1");

# 开启线程

thread1.start();

thread1.join();

print "票都抢光了,大家都散了吧!";

print "=========得票统计=========";

print "线程1:%d张" % (ticket_for_thread1);

所以必须使用现时Python建议使用的threading.

以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章