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交流群,进入后下载资料工具安装包等。最后,感谢观看!

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/pypypy/p/11835437.html
Copyright © 2011-2022 走看看