python: 查看内存地址。
1 a=1 2 print a 3 #输出物理内存地址 4 print id(a) 5 #输出物理内存地址(十六进制) 6 print hex(id(a))
内存基础(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))
在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))