内存管理

python: 查看内存地址。

1 a=1
2 print a
3 #输出物理内存地址 
4 print id(a) 
5 #输出物理内存地址(十六进制)
6 print hex(id(a))
View Code

内存基础(C语言):

一个程序就是一个进程。

堆、栈、全局/静态存储区和常量存储区。

什么是常量,全局变量,局部变量和全局静态变量?

答:常量:不可更改的,一般用const 或者 define 修饰.

  全局变量:一般用 global 修饰,在函数体外定义的变量,在总个项目有效。

  局部变量:在函数体内定义的变量,在函数体内有效。

  全局静态变量:一般用 static修饰,在本文件内有效,只初始化一次,下一次结果依赖这一次的数据。

全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,

局部变量存放在内存的栈区。系统会自动释放。

静态存储区,意识就是说程序编译时调用时就已经分配好的内存。进程只要存在就不会被释放。

一般函数对象和结构分配到内存的堆区。一般由程序员手动释放。

在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象

 1 #is 判断对象内存是否相等
 2 # True
 3 a = 1
 4 b = 1
 5 print(a is b)
 6 print(id(a),id(b))
 7 
 8 # True
 9 a = "good"
10 b = "good"
11 print(a is b)
12 print(id(a),id(b))
13 # True
14 a = "very good morning"
15 b = "very good morning"
16 print(a is b)
17 print(id(a),id(b))
18 # False
19 a = []
20 b = []
21 print(a is b)
22 print(id(a),id(b))
View Code

在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。

python中一切皆对象

比如:a=10,b=10   a是一个对象 b是一个对象 10也是一个对象。所以 id(a)==id(b)

但是 相对于list和dict来说,更改内部属性值是不会改变他的地址,比如说a重赋值为20,id(a)肯定会改变。但是 list[3]=90,id(list)不会改变。

所以

def swap(a,b,c):
    a,b,c=b,c,a

是无法交换的

但是

def swap(list):
    list[0],list[1],list[2]=list[1],list[2],list[0]
    
if __name__=='__main__':
    a=[1,3,5]
    swap(a)
    print a

是可行的

 

我们可以使用sys包中的getrefcount(),来查看某个对象的引用计数。需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

1 from sys import getrefcount
2 
3 a = [1, 2, 3]
4 print(getrefcount(a))
5 
6 b = a
7 print(getrefcount(b))
View Code
原文地址:https://www.cnblogs.com/canbefree/p/3813823.html