在Python中,所有的名字都存在一个空间中,它们在该空间中存在和被操作——这就是命名空间.它就像一个盒子,每一个变量名字都对应装着一个对象.当查询变量的时候,会从该盒子里面找到相应的对象.
【定义】
名称到对象的映射.命名空间是一个字典的实现,键为变量名,值是变量对应的值.各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响.
【分类】
Local,局部命名空间,每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量.
Global,全局命名空间,每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量.
Built-in,python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常.
【生命周期】
Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除.(每一个递归函数都拥有自己的命名空间).
Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出.
Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出.
各命名空间创建顺序:python解释器启动 -创建内建命名空间 - 加载模块 - 创建全局命名空间 -函数被调用 -创建局部命名空间
各命名空间销毁顺序:函数调用结束 - 销毁函数对应的局部命名空间 - python虚拟机(解释器)退出 -销毁全局命名空间 -销毁内建命名空间
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内部会对进行触发.
好了,全部的本期内容,欢迎大佬们评论区指正,下期见~
象的引用计数减少;
函数运行结束,所有局部变量都被销毁,对象的引用计数也就随之减少.例如 foo(x) 运行结束,x 被销毁;
使用 del 删除一个变量也会导致对象引用减少.例如 del x;
对象从集合对象中移除.例如 lst.remove(x);
包含对象的集合对象被销毁.例如 del lst;
这些操作都可能使对象变成垃圾回收对象,由垃圾收集器负责收集,当然垃圾收集器也负责处理循环引用对象.
要立即释放,可以使用下面的代码
import gc
gc.collect()
因为name这个变量的作用域只在 make_great这个函数的范围内.而不在tt所在的大的函数范围内.一旦make_great这个函数结束了,name这个变量就会被销毁而传递不出makegreat这个函数.这是为什么第一种情况你得到了none.
【Python】线程的创建、执行、互斥、同步、销毁
虽然每次运行结果是不同,但是可以看得出每次运行结果大抵上是平均的.貌似Python对线程作系统资源的处理,比Java要好.
然而,Python总要实现多线程,代码并不像想象中简单,具体如下:
[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.
以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!