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

posted @ 2019-11-11 15:36  pypypypy  阅读(617)  评论(0编辑  收藏  举报