python中垃圾回收机制_Python中的变量和垃圾回收机制

1、python中的变量

python

java

中的变量本质不一样。

java

中声明变量时要指定变量的数据类型,int、str或某一类,之后虚拟机就会在内存中申请一块空间,空间的大小跟类型相关。通俗的理解就是把变量想象成一个盒子,盒子里能装什么东西,一开始就设定了。

比如

a=1

就是将1放到盒子里面。

python

的变量实质是一个指针,指针的大小都是一样的。比如一个指向int类型的指针,指针本身大小是固定的,也不用考虑int本身所占的内存大小,反正是放在内存中。在访问int对象时只需要找到指针即可。

a=1

来说,首先去内存中声明一个int类型对象,开辟一块空间用来存储1,然后将a指向1。

a = [1,2,3]

b = a

b.append(4)

print(a) # [1,2,3,4]

这里如果用盒子的思想去理解的话:将列表

[1,2,3]

放进一个盒子中,再将a放另一个盒子中,那么修改b之后打印a的话,a就不会发生改变。

a = [1,2,3]

b = a

print(a is b) # True

通过

is

也可看到

a

b

是同一个对象,也就是

a

指向的对象

id

值和

b

指向的对象

id

值相同。

2、==和is的区别

is

上边最后说了

a = [1,2,3] b = a

这样a和b是同一个对象。那么如果是两个赋值呢?

a = [1,2,3]

b = [1,2,3]

ptint(a is b) # False

print(id(a) == id(b)) #False

从结果来看,此时的a和b是不同的对象。也就是说在使用赋值语句时会重新声明一个对象。

有一个特殊情况如下

a = 1

b = 1

print(a is b) #True

python

内部的

intern

机制——遇到相同的一定范围内的小整数时不在生成新的对象,直接指向原来的那个对象。一种内部优化的机制。

小段字符串也是一样的。

a = "abc"

b = "abc"

print(a is b) #True

用is对类进行判断

class People:

pass

person = People()

# isinstance(person,People)

if type(person) is People:

print('Yes') # Yes

因为类本身也是一个对象,而且是全局唯一的对象,

person

实际上是指向

People

的,所以

type(person)

People

的id是一样的。

==

a = [1,2,3]

b = [1,2,3]

ptint(a == b) # True

a是一个list类型的对象,list中实现了一个魔法函数

__eq__

,当遇到==时就会调用该函数判断对象的值是否相等。

3、del语句和垃圾回收机制

python

中的垃圾回收算法采用的是引用计数。

先定义

a=1

b=a

,然后1这个对象上就会自动生成一个计数器,

a=1

时计数器会加1,

b=a

说明b也指向了a,此时计数器再加1,相当于1上面有两个变量指向它。

当我们使用

del a

删除对象时,计数器则会减1。当计数器减少到0时,python解释器就会将对象回收(不能一直占用在内存中)。

c++中的删除语句是直接将对象回收,这和python不一样。

举个栗子

a=object()

b=a

del a

print(b) # object object at 0x0000000003D90F0

print(a) # name a is not defined

上面的结果就是b能打印出来,a打印不出来。过程就是将对象a删掉,同时将引用计数器减1。

python

解释器回收对象时,会去调用对象的

__del__

魔法函数。所以当我们做垃圾回收时,希望某些资源在对象被回收时释放,就可以通过重载

__del__

函数来实现。

class A:

def __del__(self):

pass

4、关于传入列表的一下注意事项

第一种情况

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = 1

b = 2

c=add(a,b)

print(c) # 3

print(a,b) # 1 2

第二种情况

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = [1,2]

b = [3,4]

c=add(a,b)

print(c) # [1,2,3,4]

print(a,b) # [1,2,3,4] [3,4]

发现此时输入的a改变了,因为列表是可变类型,+=符号在运行过程中直接赋值给原前的列表变量a,所以原来的a发生了改变。

第三种情况

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = (1,2)

b = (3,4)

c=add(a,b)

print(c) # (1,2,3,4)

print(a,b) # (1,2) (3,4)

总结

三种不同类型参数传递进来的时候,只有列表对象对原数据产生了影响。

所以当传递一个对象到函数中,对象如果是

list、dict

这类的值可被修改的类型,可能会引起原始数据的改变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

戴尔电脑好还是华为好_华硕和戴尔笔记本哪种好 华硕和戴尔优缺点分析【详解】...

随着时代快速的发展,笔记本电脑已经成了我们生活中的标配。如今,市面上笔记本电脑的款式众多,相信大家对华硕和戴尔并不陌生吧!那么,我们该怎么去选择呢?今天小编就给大家介绍华硕和戴尔笔记本哪个好&#…

php检查 session是否存在,检查sessionid已知的PHP会话是否处于活动状态

实际上,您可以将session_id和session_start用于此目的.$ids [135b29ef958a23418f2a804474787305, // active session135b29ef958a23418f2a804474787306, // inactive session135b29ef958a23418f2a804474787305, // active session];foreach($ids as $id){session_id($id);sess…

c++ python混合编程 restful_简单上手nodejs调用c++(c++和js的混合编程)

因为项目的原因,最近经常使用node.js搭RESTful接口。性能还是很不错啦,感觉比Spring Boot之类的要快。而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体开发效率比Java快的就太多了。如果想…

电脑扫描二维码_线上分享 | 网络工作坊:平板电脑工作术

澳门生产力暨科技转移中心将于9月29日下午3时,举办资讯科技工具应用线上工作坊,讲解平板电脑办公应用,欢迎有兴趣人士报名,名额有限,先到先得。该中心早前已举办是次主题的应用工作坊,坊间反应积极&#xf…

java bean 转json 串,终于找到了一篇能看懂的如何把javabean转换成json字符串的文章,嘿嘿,分享一下!...

学会了在j2ee中使用ajax后,有时候从服务器返回客户端的数据是对象,自己手动拼凑json字符串容易出错,通过谷歌知道了json-lib这个类库,方便的支持java中对象到json字符串的转化。看source-forge的json-lib介绍说,需要jakarta commo…

数据库设置_CentOS7 - 设置MySQL数据库

设置MySQL数据库本文介绍如何在CentOS上执行流行的MySQL数据库服务器的基本安装。 MySQL是当今使用最广泛的数据库系统,它可以在许多不同的行业中找到,为动态网站和大型数据仓库等各种产品提供数据存储。准备此配方要求CentOS系统具有有效的网络连接和管…

提出离职后怎么定last day_不管你因为什么离职,用正规的离职方式是你最正确的选择!...

#不管你是因为什么离职,用正规的离职方式离职是你最正确的选择,如果因为不恰当的方式造成与公司的矛盾,可能让你今后会非常被动。书面离职是最具有法律效力的,按照劳动法,你有权在提出正式离职一个月后走人&#xff0c…

mqtt php 16进制数据,phpMQTT 内存耗死问题

场景:(订阅)链接不上mqtt的时候,一下代码会出错:function read($int 8192, $nb false){// print_r(socket_get_status($this->socket));$string"";$togo $int;if($nb){return fread($this->socket, $togo);}// var_dump($this->so…

人脸识别代码_10行代码实现人脸识别

什么是人脸识别人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识…

ticketvalidationexception票根不符合目标服务_如何在有效降低企业仓储成本的同时不降低企业的总体服务质量目标水平?...

对于企业而言,如何降低仓储成本,同时要保证物流总成本最低和不降低企业的总体服务质量和目标水平的前提下进行,常见的措施有以下几点:一用“先进先出方式,减少仓储物的保管风险。”先进先出是储存管理的准则之一&#…

matlab编程 英文翻译,MATLAB编程,MATLAB programming,音标,读音,翻译,英文例句,英语词典...

Image:114994698204558.jpgmatlabmatlab是矩阵实验室(matrix laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。matlab的基本数据单位是矩阵,它的指令表达式…

python进群_Manim-python 进群问题之解答

事情起因人闲下来的时候总想找点事情做!这不,昨天考完试后在B站上逛,不小心进入了学习区,在00后学长那里看到了一个视频。链接如下:具有美感的傅里叶级数居然还能够画画!!!这让我一个…

python科学计算_可视化图解Python科学计算包NumPy

NumPy包是python生态系统中数据分析、机器学习和科学计算的主力。 它极大地简化了向量和矩阵的操作。Python的一些主要软件包依赖于NumPy作为其基础架构的基础部分(例如scikit-learn、SciPy、pandas和tensorflow)。我们将介绍一些使用NumPy的主要方法&am…

php 导出excel 特殊字符,PHPEXCEL导出,存在特殊字符遇到的问题

[13] > Array([payment_success_at] >[user_name] > ?.琳琳?[remarks] >[product_name] > 香菇[sku_name] > 斤[product_property] > 斤[price_original] > 5.50[price_current] > 5.50[consignee] > ?.琳琳?)以上代码中用户名中存在特殊符号…

win10任务栏怎么还原到下面_详解:新版 WIN 10 V2004 任务栏和开始菜单全透明

是不是很酷炫?继续往下看,你也可以简单做到导语本文将告诉你如何借助一个小工具,将最新版 WIN 10 开始菜单和任务栏设置成全透明,以获得超酷的视觉体验。安装和设置都很简单,关键是一定要找到适合 WIN 10 版本的 Start…

php是静态语言,Thinkphp静态缓存多语言切换

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1.首先判断用户有无手动指定语言2.从session中获得当前语言3.session里面没有则从cookie里面去取4.若是cookie里没有,则根据IP段判断5.若不在指定ip范围内,自动侦测浏览器语言首先我们在Common/Conf/tags.ph…

10.8.8.8柠檬wifi网页登录_基于企业邮箱进行wifi实名认证的方案

之前我们介绍过如何用钉钉认证和企业微信认证来实现企业内部的实名上网认证。此外邮箱认证也是企业进行wifi实名认证的一个有效手段。因为很多企业都给员工开通了企业邮箱,直接让员工输入邮箱账号和密码进行认证上网。配置、使用和维护都相对比较简单。本文我将介绍…

用pycharm写python老是提示错误_python pycharm错误集锦

url:http://www.cnblogs.com/hinimix/p/8016859.html1, this list creation could be rewritten as a list literal预先定义了一个listlist1 [1,2,3,4] #这么用好比list1 [1,2,3] #这么用不好list1.append(4)此时会出现该提示解决链接:https://stackoverflow.com/…

php tire树,Immutable.js源码之List 类型的详细解析(附示例)

本篇文章给大家带来的内容是关于Immutable.js源码之List 类型的详细解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。一、存储图解我以下面这段代码为例子,画出这个List的存储结构:let myL…

nodejs missing script: dev_nodejs深入学习系列之v8基础篇

V8这个概念大家都不陌生了,那么你动手编译过V8源码吗?编译后有尝试去了解V8背后的一些概念吗?如果没有,那么也不用心慌,下文将跟大家一一解释这些东西。在编译V8之前我们先要了解一个东西-构建系统1、构建系统1.1、构建…