zoukankan      html  css  js  c++  java
  • Python变量与内存管理

    Python变量与内存管理

     –与C语言中的变量做对比,更好的理解Python的变量。

    变量

    变量在C语言中 
      全局变量:其存放在内存的静态变量区中。 
      局部变量:代码块中存放在内存的代码区当中,当被调用后存放在内存栈区。

    1 而Python的变量存储,则是使用类似堆的方式管理内存,由Python内部机制统一分配回收内存。

    Python中的变量与变量存储–引用与对象

      Python作为OOP(面向对象)编程,一直信奉着一个信条,就是万物皆对象。 
      所谓对象,它可以看成经过一系列的抽象以后,将具有共性的一类物体进行实例化(具象化)的个体,就如同我们每个人就是人类里面的一个对象。

     1 class A():
     2     name = "123"
     3     def __init__(self):
     4         pass
     5 
     6     def funa(self):
     7         pass
     8 def funa():
     9     pass
    10 
    11 if __name__ == "__main__":
    12     Fun = funa
    13     Variable = 1
    14     ClassA = A()
    15     ListA = [1,2,3]
    16     DictA = {'d':1,'e':2}
    17     TupleA = (1,2,3)
    18     Str = "python"
    19     print(type(Fun))
    20     print(type(Variable))
    21     print(type(ClassA))
    22     print(type(ListA))
    23     print(type(DictA))
    24     print(type(TupleA))
    25     print(type(Str))

    输出的是:
    class ‘function’
    class ‘int’
    class ‘main.A’
    class ‘list’
    class ‘dict’
    class ‘tuple’
    class ‘str’

      很明显,Python中不管是基础数据类型,类,函数,所有的一切都是作为一个类的对象存储在内存,也可以单纯的看做一个值。

      而Python的变量就是作为一个引用,读取对象所存储的信息,与C面向过程所不同,Python变量即对象的引用,通俗来说就是指向值的名称。

      所以Python的变量只是不过对于一块指定内存的引用,也即对对象的引用,或者称为指向值的名称,相对于全局变量,局部变量的赋值只是引用另一块内存。C语言中一个变量代表一块特定的内存,而Python不像C语言,可以看成数据已经存放在内存之中了,被Python的变量对内存进行引用。即使变量不存在了,内存里值也不会受到任何影响。

     1 if __name__ == "__main__":
     2 
     3     a = 1
     4     b = 2
     5     print(id(a))
     6     print(id(b))
     7 
     8     a = b
     9     print(id(a))
    10     print(id(1))
    11     print(id(2))
    12 
    13     sys.exit(0)

    输出的是: 
    10919424 
    10919456 
    10919456 
    10919424 
    10919456 
      从输出结果来看,很明显同一块内存数据其实是可以被多个变量引用,且常量和变量的内存地址是相对应的。 

     1 def funa():
     2     a = 1
     3     print(id(a))
     4 
     5 if __name__ == "__main__":
     6 
     7     a = 1
     8     funa()
     9     print(id(a))
    10     a = 2
    11     print(id(a))
    12     funa()
    13 
    14     sys.exit(0)

    输出结果是:
    39697096
    1409448784
    39697096
    1409448784
    1409448784
       当函数被调用完,只要类实例还被引用,那么类实例依然存在类似c++的new,当del对象时,不影响对象还在被外部变量引用的值。
       
      当我们若是del掉classA后,再输入print(id(classA)),会出现如下错误: 

    1 Traceback (most recent call last):
    2    File "C:/Users/Administrator/PycharmProjects/pysidetest/demo.py", line 69, in <module>
    3      print(id(classA))
    4  NameError: name 'classA' is not defined

    如果还有问题未能得到解决,搜索887934385交流群,进入后下载资料工具安装包等。最后,感谢观看!

  • 相关阅读:
    [再寄小读者之数学篇](2014-07-17 一阶中值)
    对流体力学做出巨大贡献的杰出历史人物
    理科生毁灭世界
    [再寄小读者之数学篇](2014-07-17 行列式的计算)
    [再寄小读者之数学篇](2014-07-16 高阶导数的一个表达式)
    [再寄小读者之数学篇](2014-07-16 与对数有关的不等式)
    [再寄小读者之数学篇](2014-07-16 凹函数与次线性性)
    [再寄小读者之数学篇](2014-07-16 二阶中值)
    [再寄小读者之数学篇](2014-07-16 任意阶导数在零处为零的一个充分条件)
    对PostgreSQL xmin的深入学习
  • 原文地址:https://www.cnblogs.com/pypypy/p/11835437.html
Copyright © 2011-2022 走看看