学习日志---python继续,,内存管理:使用垃圾回


内存管理:

使用垃圾回收机制,垃圾回收的策略是引用技术(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"printaprinta[::-1]

上面输出正向,下面输出反向。


类型转换:

实际上是创建了一个新的对象,通过id()这个函数可以去分析得到。

list和turple都是函数,工厂函数,可以对序列进行转换。

a=[1,2,3]printtuple(a)


序列的内建函数:不是方法,是函数,这些都是函数,不是对自身序列的改变,而是重新建一个;

enumerate(iter):该方法生成键值组合的可迭代对象,key是指名位置;

len():返回长度;

reversed(seq):返回一个方向序列,用在循环中;

sorted(序列,func=,key=,reverse=):返回排序后的列表;

http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html

http://www.cnblogs.com/woshitianma/p/3222989.html

lambda是把序列中的每一项当作一个整体,用下标的方式去指明,如果是一个类,则可以用类中的元素去比较,key是指传一个参数进去的函数,输出作为比较的依据;func是传递两个参数,两两比较返回序列。


sum(集合,起始值)求和;

forhead,valueinenumerate(a):printhead,"",valueprintlen(a)foriinreversed(a):printiprintsorted(a,reverse=True)printsum(a)


字符串:

字符串是不可变的序列,任何一点改变都是创建新的字符串,有两种字符串,有普通字符串和unicode字符串,推荐使用unicode字符串!

因为每次+都会创建新的字符串,为了避免很多的临时字符串,使用join方法

sl=["hello","we","love","python"]sl="".join(sl)printsl

以空格作为中间符号把单个字符串连起来。


Unicode编码

utf-8是可变的,一字节到四字节,一般一个汉字占三个字节,也可以四个

utf-16和utf-32,分别表示最少占用16位和32位。


元组真的不能被修改吗?

序列实际上是容器,存的都是元素的地址

a=(1,2,3,4,[1,2,3,4])a[4].append(5)printa

a可以改内部的东西,因为它认为其地址没变,即没变


拷贝

浅拷贝和深拷贝

浅拷贝:切片,序列方法。。

内层的序列不会重新生成,而是和以前的共用一个。

深拷贝:copy模块的deepcopy函数

内外的序列都是重新生成的

c=copy.deepcopy(a)


学习日志---python继续

评论关闭