python变量类型是动态的_python内存动态分配过程详解

一、前言

大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前。其他语言,想C++和java,允许“随时随地”声明变量,比如,变量声明可以在代码块的中间,不过仍然必须在变量被使用前声明变量的名字和类型。

在Python中,无序此类显式变量声明语句,变量在第一次被赋值时自动声明。和其他大多数语言一样,变量只有被创建和赋值后才能被使用。

# 变量未声明

>>> x

Traceback (most recent call last):

File "", line 1, in

NameError: name 'x' is not defined

#变量一旦被赋值,就可以通过变量名来访问它

>>> x=1

>>> y="It's wonderful."

>>> x

1

>>> y

"It's wonderful."

二、动态类型

Python中不但变量名无需事先声明,而且也无需类型声明。在Python语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python仍然是一种解释型语言。在赋值时解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的应用会被赋值给左侧的变量。

三、内存分配

作为一个负责任的程序员,我们知道在为变量分配内存时,是在借用系统资源,在用完之后,应该释放借用的系统资源。Python解释器承担了内存管理的复杂任务,这大大简化了应用程序的编写。

3.1 引用计数

要保持追踪内存中的对象,Python使用了引用计数这一简单技术。也就是说Python内部记录着所有使用中的对象 各有多少引用。一个内部跟踪变量,称为引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。(并不是100%这样)

3.2 增加引用计数

当对象被创建并赋值给变量时,该对象的引用计数就被设置为1。

当同一个变量又被赋值给其他变量时,或作为参数传递给函数、方法或类实例,或者被赋值为一个窗口对象的成员时,该对象的一个新的引用,或者称为别名,就被创建(则该对象的引用计数就自动加1)。

如下代码:

>>> x = 3

>>> y = x

2019715104253170.png?201961510433

语句x=3我们将3赋值给x。x是第一个引用,因此,该对象的引用计数被设置为1。语句y=x创建了一个指向同一对象的别名y。事实上并没有为y创建一个新的对象,而是该对象的引用计数增加了一次(变成了2)。这是对象引用计数增加的方式之一。还有一些其他的方式也能增加对象的引用计数,比如该对象作为参数被函数调用或这个对象被加入到某个列表等对象当中。

总之,对象的引用计数增加是:

对象被创建 x = 3

另外的别名被创建 y = x

作为参数传递给函数 foo(x)

成为容器对象的一部分 mylist = [1,2,x,'xyz']

3.3 减少引用计数

当对象的引用被销毁时,引用计数会减小。最明显的例子就是当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有的局部变量都被自动销毁,对象的引用计数也就随之减少。

当变量被赋值给另外一个对象时,原对象的引用计数也会自动减1:

>>> foo = 'xyz'

>>> bar = foo

>>> foo = 123

当字符串对象“xyz”被创建并赋值给foo时,它的引用计数是1。当增加一个别名bar时,引用计数变成了2。不过当foo被重新赋值给整型对象123时,xyz对象的引用计数自动减1,又重新变成了1。

其他造成对象引用计数减少的方式包括使用del语句删除一个变量,或者当一个对象被移出一个窗口对象时。

对象引用计数减少的情况:

一个本地引用离开了其作用的范围。比如foo() 函数结束时。

对象别名被显式销毁 del y

对象的一个别名被赋值给其他对象 x = 123

对象被从一个窗口对象中移除 mylist.remove(x)

窗口对象本身被销毁 del mylist

四、垃圾收集

不再使用的内存会被一种称为垃圾收集的机制释放。像上面说的,虽然解释器跟踪对象的引用计数,但垃圾收集器负责释放内存。垃圾收集器是一块独立代码,它用来寻找计数为0的对象。它也负责检查那些虽然引用计数大于0但也应该被销毁的对象。特定情形会导致循环引用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: python内存动态分配过程详解

本文地址: http://www.cppcns.com/jiaoben/python/265415.html

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

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

相关文章

python树莓派串口通信实例_树莓派通过串口发送数据

可以通过串口登陆树莓派,也可以通过串口向其他主机发送数据。树莓派的串口接受数据科技爱好者博客已经写过,可以参考这篇文章:树莓派与arduino串口通信实践。这篇文章教大家如果通过树莓派的串口发送数据。 一、开启树莓派的串口功能 sudo ra…

sklearn朴素贝叶斯分类器_python机器学习:方法链和朴素贝叶斯分类器

今天我们在学习朴素贝叶斯分类器之前,我们先来总结下前面经常用到的内容,方法链:在scikit-learn中所有模型的fit方法返回的都是self。我们用一行代码初始化模型并拟合,对应代码如下:logreg LogisticRegression().fit(…

24v开关电源维修技巧_焊机维修案例汇总6

案例1:开机保护检查整流桥、场管、快恢复二极管都正常。通电试机,面板亮黄灯,拔掉中板变压器接插线,黄灯灭,怀疑中板变压器有损坏。断电,用电感表测量变压器电感量,中板采用三个变压器并联&…

华为鸿蒙mota30手机多少钱,华为Mate30系列基本确认:麒麟985、鸿蒙系统、5G,价格满意!...

原标题:华为Mate30系列基本确认:麒麟985、鸿蒙系统、5G,价格满意!现在华为越来越的受到国人的重视,一方面是因为米国对于华为的不公正待遇,另一方面还是因为华为产品可以真正的让用户们认可。现在&#xff…

android组合控件 重叠,Android 组合控件实现布局的复用的方法

看到很多项目会有实现自己的标题栏的做法,通常的界面是左边按钮或文字,加上中间的标题和右边的按钮或文字组成的。比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用。但是这种方法是通过代码的方式来设置标题&#xff0…

1到100的偶数之和是多少_新射雕群侠传之铁血丹心手游新侠客独孤求败全渠道上线 新玩法桃花岛开启...

点击上面蓝字获取更多精彩资讯金庸正版授权手游《新射雕群侠传之铁血丹心》新英雄独孤求败傲世登场,桃花岛新惊喜即将海量释放!国庆最长假期即将到来,《新射雕群侠传》玩法福利再度升级,不止是神话品质独孤求败的安卓全渠道开放,更…

python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计(验证性实验)...

安徽工程大学 Python程序设计实验报告 班级物流192姓名芦靓学号3190505217成绩 日期2020.3.19 指导老师修宇 【实验名称】 实验二 顺序结构程序设计(验证性实验) 【实验目的】 (1)掌握数据的输入输出的方法; &#xff…

三星s9android recovery,三星手机怎么进入recovery模式?详细图文教程指导

【刷机之家】其实对于经常刷机的朋友来说进入recovery模式是一件再正常不过的事情了,但是对于很多刚刚接触刷机的新手朋友来说可能不太了解,当你仔细阅读完本教程之后相信即使你是一个完全不了解刷机的朋友也会知道该如何进入recovery模式。本教程主要是…

css布局方式_网页布局都有哪种?一般都用什么布局?

随着Web技术不断的革新,CSS近几年也变得多年前要更强大。在Web开发中,CSS是不可或缺的一部分,对于很多Web开发者来说,有很多CSS属性不知道,或者说他们知道,但忘记在最恰当的时候使用最适合的CSS属性。而且时…

复合消隐信号的作用_南大《AFM》:可拉缩、粘合、导电的双信号柔性彩色薄膜...

导读:本文得到了一种可伸缩、可粘合、可自修复、可导电的双信号柔性电子结构彩色薄膜,具有很大的应用潜力。柔性电子设备在各种应用中发挥着不可忽视的作用,如健康监控、感觉皮肤、可植入设备等。柔性电子材料的研究已取得了很大进展&#xf…

三轴加速度传感器和六轴惯性传感器_一文读懂汽车MEMS惯性传感器的七大应用(上)...

本文中,我们将研究汽车MEMS惯性传感器的应用,描述它们的工作原理,并讨论如何利用MEMS惯性传感器来实现更大的应用改进。 当前,微机电系统(MEMS)传感器已被大多数汽车工程师视为尖端技术或边缘技术&#xff…

criteria函数_干货铺 | 二级MS office考试中一些常考函数(2)

同步文章:二级MS office考试中一些常考函数(2)1.AVERAGE(Number1,Number2,…)函数——计算平均值函数:参数解释:Number1,number2,...是要计算平均值的 1~255 个参数。2.averageif(ra…

html中图片透明度渐变效果,css怎么设置透明度渐变?

css怎么设置透明度渐变?下面本篇文章给大家介绍一下使用CSS设置透明度渐变效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。css怎么设置透明度渐变?在CSS中可以使用linear-gradient()函数配合rgba()来…

oc 画一个圆弧_SolidWorks一步扫描特征,就可以画出一个螺母,你有思路吗

建模过程:1.在【上视基准面】画一个六边形。(引导线)1-1.圆角,半径:2 ,框选六边形。2.在【前视基准面】画草图如下:(轮廓)2-1.左侧画一段竖直构造线,端点与圆弧穿透几何关系。3.【线段】草图绘制点&#xf…

python默认安装位置_如何更改python中pip的默认安装路径

具体方法: 1、查看 site.py 文件的位置(一般在python安装目录的\Lib下),可使用指令查询:python -m site -help2、打开site.py文件,更改 USER_BASE 和USER_SITE 的路径即可。其中 USER_BASE 和USER_SITE其实就是用户自定…

java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...

电脑对于我们所有人来说都是一项非常伟大的发明。目前,在我们的生活中它已经成为了一个不可或缺的工具。时时围绕在我们的周围,如果离开电脑,可以说很多人都将寸步难行,科技也得不到发展。那么作为电脑的初学者,我们该…

动词ing形式的5种用法_英语语法这样学就对了!动词-ing结构的特征和四种形式是?...

想彻底学好英语一定要善于总结语法!动词-ing结构的特征和四种形式都是什么?想彻底学好英语,语法这一关是一定要过的。我将通过这个平台定期更新实用、常用的英语语法知识解读,直至覆盖完全部的英语语法知识点,使你通过…

mysql 数据迁移_【AWS 功能】Mysql 数据库迁移至Amazon RDS方案

今天,我们讲讲如何使用源MySQL数据库执行数据库迁移到MySQL数据库的目标Amazon RDS的方案,同时由于(源和目标数据库引擎是相同的)——模式结构、数据类型和数据库代码在源和目标数据库之间是兼容的,这意味着这种迁移不需要任何模式转换。数据…

eclipse run on server 点不了finish_分享点经验 | springboot入门及编码

点击蓝字关注我们AMP很多新人在刚刚接触后端开发的时候,可能对springboot的概念、如何快速上手一个springboot项目多多少少有些一知半解;此外写出来的代码也因为不够规范而可读性较低,导致后期难以维护。本文旨在站在新手的视角,尽…

mac redis 客户端_分享一个免费好用的Redis桌面客户端

今天波波为做开发的朋友们分享一个免费好用的Redis桌面客户端。这个工具纯属机缘巧合下发现的,前几天波波在开发一个物联网平台,硬件通信部分用了Workman Gateway来负责通信和消息推送,结果因为自己把官方的文档理解错误,遇到了一…