1、python内存管理
(1)对象内存使用
&nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存中的地址。在python中,整数和短小的字符,python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。
a = 1
b = 1print(id(a))
print(id(b))
python中,通过is关键字可以判断两个引用是否指向同一个对象,即 obj1 is obj2 <===> id(obj1) 是否等于 id(obj2)
# True
a = 1
b = 1
print(a is b)# True
a = "good"
b = "good"
print(a is b)# False
a = "very good morning"
b = "very good morning"
print(a is b)# False
a = []
b = []
print(a is b)由于Python缓存了整数和短字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。
即使使用赋值语句,也只是创造了新的引用,
而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。
在python中,每个对象都有存有指向该对象的引用总数,即引用计数。通过sys包中的getrefcount()方法可以查看某个对象的引用计数。需要注意的是当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。
from sys import getrefcounta = [1, 2, 3]
print(getrefcount(a)) # 2b = a
print(getrefcount(b)) #3
(2)对象引用对象
python的一个容器对象,比如列表、词典等,可以包含多个对象。实际上,容器对象中包含的并不是元素对象本身,是指向各个元素对象的引用。
也可以自己定义一个对象,中间引用其他的对象:
class from_obj(object):def __init__(self, to_obj):self.to_obj = to_objb = [1,2,3]
a = from_obj(b)
print(id(a.to_obj))
print(id(b))
(3)引用减少
某个对象的引用计数可能减少,比如,可以使用del关键字删除某个引用:
from sys import getrefcounta = [1, 2, 3]
b = a
print(getrefcount(b)) #3del a #删除了一个引用
print(getrefcount(b)) #2
del也可以用于删除容器中的元素,比如:
a = [1,2,3]del a[0]print(a) #删除a[0]引用,则a[0]指向的对象可能会被释放(如果没有其他引用指向它的话)
如果某个引用指向对象A,当这个引用被重新定向到某个其他对象B时,对象A的引用计数减少:
from sys import getrefcounta = [1, 2, 3]b = aprint(getrefcount(b))a = 1print(getrefcount(b))
(4)垃圾回收
python的内存自动回收机制使得程序不需要自己释放内存。
2、python内置函数
python内置函数随着python解释器的运行而创建。在python程序中,你可以随时调用这些函数,不需要定义。常见的内置函数如下:
print(), type(), dir(), help(), len(), open(), range(), enumerate(),zip(), iter(), map(), filter(), reduce(),
分类总结:
数学运算abs(-5) # 取绝对值,也就是5round(2.6) # 四舍五入取整,也就是3.0pow(2, 3) # 相当于2**3,如果是pow(2, 3, 5),相当于2**3 % 5cmp(2.3, 3.2) # 比较两个数的大小divmod(9,2) # 返回除法结果和余数max([1,5,2,9]) # 求最大值min([9,2,-4,2]) # 求最小值sum([2,-1,9,12]) # 求和类型转换int("5") # 转换为整数 integerfloat(2) # 转换为浮点数 floatlong("23") # 转换为长整数 long integerstr(2.3) # 转换为字符串 stringcomplex(3, 9) # 返回复数 3 + 9iord("A") # "A"字符对应的数值chr(65) # 数值65对应的字符unichr(65) # 数值65对应的unicode字符bool(0) # 转换为相应的真假值,在Python中,0相当于Falsebin(56) # 返回一个字符串,表示56的二进制数hex(56) # 返回一个字符串,表示56的十六进制数oct(56) # 返回一个字符串,表示56的八进制数list((1,2,3)) # 转换为表 listtuple([2,3,4]) # 转换为定值表 tupleslice(5,2,-1) # 构建下标对象 slicedict(a=1,b="hello",c=[1,2,3]) # 构建词典 dictionary**粗体文本**序列操作all([True, 1, "hello!"]) # 是否所有的元素都相当于True值any(["", 0, False, [], None]) # 是否有任意一个元素相当于True值sorted([1,5,3]) # 返回正序的序列,也就是[1,3,5]reversed([1,5,3]) # 返回反序的序列,也就是[3,5,1]类,对象,属性# define classclass Me(object):def test(self):print "Hello!"def new_test():print "New Hello!"me = Me()hasattr(me, "test") # 检查me对象是否有test属性getattr(me, "test") # 返回test属性setattr(me, "test", new_test) # 将test属性设置为new_testdelattr(me, "test") # 删除test属性isinstance(me, Me) # me对象是否为Me类生成的对象 (一个instance)issubclass(Me, object) # Me类是否为object类的子类编译,执行repr(me) # 返回对象的字符串表达compile("print('Hello')",'test.py','exec') # 编译字符串成为code对象eval("1 + 1") # 解释字符串表达式。参数也可以是compile()返回的code对象exec("print('Hello')") # 解释并执行字符串,print('Hello')。参数也可以是compile()返回的code对象其他input("Please input:") # 等待输入globals() # 返回全局命名空间,比如全局变量名,全局函数名locals() # 返回局部命名空间
参考:
http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html