一、前言

大多数编译型语言,变量在使用前必须先声明,其中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

语句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

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

  1. python变量类型是动态的_Python 学习 第四篇:动态类型模型

    Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...

  2. python如何制作脚本_用python给自己做一款小说阅读器过程详解

    前言 前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而 ...

  3. python变量类型有几种_python十种变量类型

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.因此,变量可以指定不同的数据类型,这些变量可以存储整数, ...

  4. python calu()_python使用配置文件过程详解

    这篇文章主要介绍了python使用配置文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过配置文件将变量暴露给用户修改 标准库模块con ...

  5. python变量类型是动态的_【Python】python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  6. python变量类型怎么决定的_Python数据类型提示痛点的解决方案探讨

    几个月前,你写了一段Python代码,当时只有你和上帝能看懂.几个月后,这段代码就只有上帝能看懂了. 痛点是什么 Python是一门弱类型的动态语言,在看其他人写的一些Python项目的代码.特别是大 ...

  7. python变量类型怎么决定的_python里测试变量类型用什么

    Python中测试变量类型可以使用isinstance()函数或type()函数来完成. isinstance() 函数: isinstance()函数来判断一个对象是否是一个已知的类型,类似 typ ...

  8. 用python处理excel的基本语法_Python对Excel操作详解

    Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl tco ...

  9. python输入文字、成为字典_Python 字典(Dictionary)操作详解

    一.创建字典 字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} ...

最新文章

  1. 剑指offer(34-40题)详解
  2. python 基础教程:字符串内建函数之大小写的区别
  3. 删除已有的 HTML 元素
  4. python之操作系统介绍,进程的创建
  5. 下一代低延时直播CDN:HLS、RTMP 与UDP +WebRTC
  6. ES10的动态导入文件
  7. Android 动态添加Button(1)
  8. 并发编程中的重重量级模型和轻量级模型
  9. android根据银行卡卡号判断银行
  10. 大学计算机基础word操作2018,大学计算机基础试题及答案2017
  11. php dingo和jwt,三、Laravel5.4+Dingo+JWT 开发API
  12. opop如何和计算机链接,oppo如何连接电脑
  13. java 打印出如下图案(菱形)
  14. 【Android】studio查看日志解决刷爆问题
  15. 图形和函数图像的绘制
  16. 在局域网内如何访问另一台计算机
  17. HTML3/CSS基础
  18. Newtonsoft.Json 使用
  19. corn表达式的使用
  20. SpringCloud Hystrix超时:HystrixRuntimeException: xxx failed and no fallback available

热门文章

  1. Centos7.x Hadoop 3.x HDFS 写入文件
  2. 基于SpringMVC进行REST服务开发
  3. Spring整合JDBC开发
  4. solaris php,针对 Solaris 的安装提示
  5. 台式计算机更新不了,台式机更新造成电脑关不了机怎么办
  6. java线程切换速度_为什么说线程太多,cpu切换线程会浪费很多时间?
  7. 在html中怎么写背景色渐变,css3背景色渐变
  8. python upper_Python 3中的模块级string.upper函数在哪里?
  9. jdbc odbc java mysql数据库连接_Java数据库连接之配置ODBC数据源
  10. 搜狗浏览器怎么新建隐私窗口 搜狗浏览器开启隐私窗口教程