一、前言

  大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前。其他语言,想C++和java,允许“随时随地”声明变量,比如,变量声明可以在代码块的中间,不过仍然必须在变量被使用前声明变量的名字和类型。在Python中,无序此类显式变量声明语句,变量在第一次被赋值时自动声明。和其他大多数语言一样,变量只有被创建和赋值后才能被使用。

 1 # 变量未声明2 >>> x3 Traceback (most recent call last):4   File "<stdin>", line 1, in <module>5 NameError: name 'x' is not defined6 7 #变量一旦被赋值,就可以通过变量名来访问它8 9 >>> x=1
10 >>> y="It's wonderful."
11 >>> x
12 1
13 >>> y
14 "It's wonderful."

回到顶部

二、动态类型

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

回到顶部

三、内存分配

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

3.1 引用计数

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

3.2 增加引用计数

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

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

  如下代码:  

1 >>> x = 3
2 >>> 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:

1 >>> foo = 'xyz'
2 >>> bar = foo
3 >>> 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但也应该被销毁的对象。特定情形会导致循环引用。

转载于:https://www.cnblogs.com/shanghongyun/p/10629898.html

python的内存分配相关推荐

  1. 说说几个 Python 内存分配时的小秘密

    Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解释器强交互的函数. 本文将会频繁地使用该模块的getsizeof()方法,因此,我先简要介绍一 ...

  2. Python 内存分配时的小秘密

    Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解释器强交互的函数. 本文将会频繁地使用该模块的getsizeof()方法,因此,我先简要介绍一 ...

  3. python字典功能默写_Python 内存分配时的小秘密

    Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解释器强交互的函数. 本文将会频繁地使用该模块的getsizeof()方法,因此,我先简要介绍一 ...

  4. python 去空_Python 内存分配时的小秘密

    (给Python开发者加星标,提升Python技能) 作者:豌豆花下猫 (本文来自作者投稿) Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解 ...

  5. 揭开 Python 内存分配时的小秘密!

    作者 | 豌豆花下猫 责编 | 胡巍巍 Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解释器强交互的函数. 本文将会频繁地使用该模块的gets ...

  6. python清空列表_Python 内存分配时的小秘密

    (给Python开发者加星标,提升Python技能) 作者:豌豆花下猫 (本文来自作者投稿) Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解 ...

  7. python3内存分析_调试和分析 - tracemalloc —- 跟踪内存分配 - 《Python 3.7 标准库》 - 书栈网 · BookStack...

    tracemalloc -- 跟踪内存分配 3.4 新版功能. The tracemalloc module is a debug tool to trace memory blocks alloca ...

  8. python内存分配失败_关于python:如何避免[Errno 12]无法分配使用子进程模块导致的内存错误...

    完整的工作测试案例 当然,根据您在本地和远程计算机上的内存,您的阵列大小会有所不同. z1 = numpy.random.rand(300000000,2); for i in range(1000) ...

  9. python 申请内存_python内存分配

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它 ...

最新文章

  1. Blender中的Python脚本介绍学习教程
  2. Java Web中的Filter和Interceptor的区别
  3. java workerdone_【架构】Java并发编程——线程池的使用
  4. 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步
  5. mysql php教程,MySQL PHP语法
  6. 源码调试debug_info 的作用和使用方法
  7. python基础笔记_python基础学习笔记
  8. android uboot log,RK3288 Android 8.1系统uboot logo过渡到kernel logo会花一下
  9. 复习Django项目二——创建app应用程序
  10. 普通人,如何实现年收入百万?
  11. java前端 js弹出框_前端js弹出框组件使用方法
  12. java几次,java兑现限制用户几次登录
  13. Keras实现卷积神经网络
  14. LabWindows/CVI入门之第一章:LabWindows/CVI开发环境
  15. saas 系统租户个性化域名租户绑定自己域名的解决方案
  16. FM收音机 RDS的强大功能
  17. 东华助手 v1.6.5
  18. 软件工程知识点复习第二章
  19. 【Linux操作系统基础】第六章 Linux中的进程管理
  20. 去云南看你们风花雪月

热门文章

  1. python从2.6升到2.7后 桌面输入法图标不见
  2. XCode 6 制作framework
  3. 火狐一打开就弹出错误控制台 解决方案 及常用插件列表备份
  4. 使用Vitamio打造自己的Android万能播放器(1)——准备
  5. 数据访问模式二:数据集和数据适配器(传统的数据访问模式)
  6. WPF触屏Touch事件在嵌套控件中的响应问题
  7. 一本通 1282:最大子矩阵
  8. 拼多多4.5元手表使用功能图
  9. No changes detected解决方案
  10. awk输出csv的一列