内存管理:
使用垃圾回收机制,垃圾回收的策略是引用技术(reference counting);
对象的三个要素:identity内存地址(不可变);type类型(不可变);value值。
id()这个函数是返回这个对象的地址,用于判断是否是同一个函数。如id("aaa")
引用计数:
一块内存地址被指向的次数,如果为0的话就说明回收这块空间。
整形缓冲池:
整形值预先进行了分配,不会被回收。缓冲池的换位可以通过修改源码来改变,根据具体项目来设定,提高效率。
def是同一个,a=def class是不同的对象,a=class(),这个是分配新的内存;
is语句:
判断是否是同一个对象,判断是否是指向同一个内存!!
序列中的元素可以用下标去访问,从0开始,也可以从负数做下标,-1序列尾部的元素,如可以l[-1]取得l中的最后一个元素。
连接操作:
序列可以用+号操作,使两个序列合在一起,这种是创建一个新的序列。
extend方法只支持list,这个是在原序列基础上加长。如a.extend(b),a加长,变为a+b;
append方法只支持list,添加单个元素;
del a[2],只支持list,删除a中2位置的内容;
[序列]*数字,可以实现复制,返回一个新的序列;
切片slice:
[起点:终点:步进],包括起点,不包括终点;如a[::2],表示a序列中,取步进为2的值。
特殊情况:
当步进为负数时,走的方向相反,从尾部为起点。负号表示方向。可以输出反向的字符串作用。
a="string" print a print a[::-1]
上面输出正向,下面输出反向。
类型转换:
实际上是创建了一个新的对象,通过id()这个函数可以去分析得到。
list和turple都是函数,工厂函数,可以对序列进行转换。
a=[1,2,3] print tuple(a)
序列的内建函数:不是方法,是函数,这些都是函数,不是对自身序列的改变,而是重新建一个;
enumerate(iter):该方法生成键值组合的可迭代对象,key是指名位置;
len():返回长度;
reversed(seq):返回一个方向序列,用在循环中;
sorted(序列,func=,key=,reverse=):返回排序后的列表;
http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html
lambda是把序列中的每一项当作一个整体,用下标的方式去指明,如果是一个类,则可以用类中的元素去比较,key是指传一个参数进去的函数,输出作为比较的依据;func是传递两个参数,两两比较返回序列。
sum(集合,起始值)求和;
for head,value in enumerate(a): print head," ",value print len(a) for i in reversed(a): print i print sorted(a,reverse=True) print sum(a)
字符串:
字符串是不可变的序列,任何一点改变都是创建新的字符串,有两种字符串,有普通字符串和unicode字符串,推荐使用unicode字符串!
因为每次+都会创建新的字符串,为了避免很多的临时字符串,使用join方法
sl=["hello","we","love","python"] sl = " ".join(sl) print sl
以空格作为中间符号把单个字符串连起来。
Unicode编码
utf-8是可变的,一字节到四字节,一般一个汉字占三个字节,也可以四个
utf-16和utf-32,分别表示最少占用16位和32位。
元组真的不能被修改吗?
序列实际上是容器,存的都是元素的地址
a=(1,2,3,4,[1,2,3,4]) a[4].append(5) print a
a可以改内部的东西,因为它认为其地址没变,即没变
拷贝
浅拷贝和深拷贝
浅拷贝:切片,序列方法。。
内层的序列不会重新生成,而是和以前的共用一个。
深拷贝:copy模块的deepcopy函数
内外的序列都是重新生成的
c=copy.deepcopy(a)