python局部函数销毁,python销毁变量

Python中的类变量、实例变量、局部变量

类体内,所有函数外定义。

目前成都创新互联公司已为上千多家的企业提供了网站建设、域名、网站空间成都网站托管、企业网站设计、武江网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

所有实例对象共享。

只有通过类名调用时才能修改,通过实例调用时无法修改。

假设某类变量名为“name",如果用该类的某个实例x来为name赋值:x.name = 'xxx',实质是为该实例新定义了一个变量name。且之后无法再通过该实例调用类变量name了。因为使用实例调用某名为“xxx”变量时,若该实例没有名为“xxx”的实例变量,则会去调用名为“xxx”的类变量;若有该名称的实例变量,则该实例无法再直接调用该名称对应的类变量。因此也不推荐通过实例来调用类变量。

即:通过类实例修改类变量的值时,实际是在定义新的与类变量同名的实例变量。

类体内,某函数(一般是__ init __ ())内定义。 “self.变量名”

因为是属于某个具体实例的,因此不能通过类名访问。

如果不在__ init __ () 中调用(该函数会在创建实例时自动调用一次),则只有调用该实例中定义目标实例变量的那个函数后,才能使用目标实例变量。因此最好在__ init __ () 中定义实例变量。

类体内,某函数内定义。

直接在函数内用“变量名=值”的方式进行定义。

函数执行完毕后,该局部变量即被销毁。

python命名空间是什么

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

【定义】

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

相关推荐:《Python教程》

【分类】

python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。按照变量定义的位置,可以划分为以下3类:

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

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

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

【生命周期】

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

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

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

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

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

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

如何释放Python占用的内存

象的引用计数减少;

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

当变量被赋值给另一个对象时,原对象的引用计数也会减少。例如 x = 4,这时候 3 这个对象的引用计数就减 1 了;

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

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

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

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

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

import gc

gc.collect()

python线程怎么销毁

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

还是《【Java】利用synchronized(this)完成线程的临界区》(点击打开链接)、《【Linux】线程互斥》(点击打开链接)、《【C++】Windows线程的创建、执行、互斥、同步、销毁》(点击打开链接)中的设置多个线程对一个ticket进行自减操作,用来说明Python中多线程的运用,涉及的创建、执行、互斥、同步、销毁问题。

运行结果如下,还是差不多,运行三次,每次的运行结果,每个线程最终的得票结果是不同的,但是4个线程最终“得票”的总和为 ticket 最初设置的值为100000,证明这4个线程成功实现了互斥。

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

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

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

# -*-coding:utf-8-*-

import threading;

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

ticket = 100000; # 总票数

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

ticket_for_thread1 = 0;

ticket_for_thread2 = 0;

ticket_for_thread3 = 0;

ticket_for_thread4 = 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;

global ticket_for_thread2;

global ticket_for_thread3;

global ticket_for_thread4;

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;

elif self.thread_name == "线程2":

ticket_for_thread2 += 1;

elif self.thread_name == "线程3":

ticket_for_thread3 += 1;

elif self.thread_name == "线程4":

ticket_for_thread4 += 1;

else:

break;

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

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

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

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

# 初始化线程

thread1 = myThread("线程1");

thread2 = myThread("线程2");

thread3 = myThread("线程3");

thread4 = myThread("线程4");

# 开启线程

thread1.start();

thread2.start();

thread3.start();

thread4.start();

# 等到线程1、2、3、4结束才进行以下的代码(同步)

thread1.join();

thread2.join();

thread3.join();

thread4.join();

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

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

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

print "线程2:%d张" % (ticket_for_thread2);

print "线程3:%d张" % (ticket_for_thread3);

print "线程4:%d张" % (ticket_for_thread4);

1、从上面的代码可以看出,在Python2.7中要使用线程必须使用threading而不是古老的thread模块。

如果你像网上部分遗留依旧的文章一样,在Python2.7中使用thread来实现线程,至少在Eclipse的Pydev中会报错:sys.excepthook is missing,lost sys.stderr如下图所示:

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

2、与其它编程语言类似,声明一个互斥锁,与一系列的得票数。之后,与Java同样地,Python实现线程的函数,是要重写一个类。而类中使用全局变量,则与同为脚本语言的PHP一样《【php】global的使用与php的全局变量》(点击打开链接),要用global才能使用这个全局变量,而不是C/C++可以直接使用。

3、需要注意的,Python需要在线程跑完class myThread(threading.Thread)这个类的def run(self)方法之前,必须自己手动清理互斥锁,它不会像其它编程语言那样,说线程跑完def run(self)方法,会自然而然地清理该线程被创建的互斥锁。如果没有最后一句手动清理互斥锁,则会造成死锁。

4、最后与其它编程语言一样了,利用线程的join方法可以等待这个线程跑完def run(self)方法中的所有代码,才执行之后的代码,实现同步。否则主函数中的代码,相当于与父线程。主函数开启的线程,相当于其子线程,互不影响的。


新闻标题:python局部函数销毁,python销毁变量
地址分享:http://cdiso.cn/article/dsgocos.html

其他资讯