尘埃光影 发表于 2013-1-19 04:09:55

对前一次python统计的优化

import reimport copyfor i in infile:temp = file(i)text= temp.read()for j in range(len(li)):m = re.findall(li.website,text,re.S|re.M|re.L)if len(m) != 0:cdncopy = copy.deepcopy(li.cdn)cdncopy.append(i[:-6])li.cdn = cdncopyli.number += 1

前一次设计的文件读写操作过多,每个文件只读取一次

用到了re模块,主要用来作正则匹配的,但是由于读取文件来做匹配,所以字符串中会包含\n,所以re.S|re.M|re.L很重要,用来告之进行多行匹配

用到了copy模块,因为我在list中又有一个子list,而list的append函数是不做深拷贝的,所以:
list.cdn.append("快网")
list.cdn.append(“快网”)
print list.cdn #["快网",“快网”]
print list.cdn #["快网",“快网”]
就像是cdn被共用了
因此需要用深拷贝将其拷贝出来再复制,这是大多数新人容易犯的错误(包括我)

#此处是搜集到的理解深拷贝,前拷贝的两个例子
li=[]next=for i in range(5):      next=i      next=i      li.append(next)print lili=[]for i in range(5):    next=[]       next.append(i)    next.append(i)    li.append(next)print li

结果:
[, , , , ]
[, , , , ]

#另一个例子
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象

用一个简单的例子说明如下:

>>>import copy
>>>a = ]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)

很容易理解:a是一个列表,表内元素a也是一个列表(也就是一个内部子对象);b是对a列表的又一个引用,所以a、b是完全相同的,可以通过id(a)==id(b)证明。

第4行是浅拷贝,第五行是深拷贝,通过id(c)和id(d)可以发现他们不相同,且与id(a)都不相同:

>>> id(a)
19276104
>>> id(b)
19276104
>>> id(c)
19113304
>>> id(d)
19286976

至于如何看深/浅拷贝的区别,可以通过下面的操作来展现:

>>> a.append(5)    #操作1
>>> a.append('hello')   #操作2

这时再查看结果:

>>> a
, 5]
>>> b
, 5]
>>> c
]
>>> d
]

可以发现a、b受了操作1、2的影响,c只受操作2影响,d不受影响。a、b结果相同很好理解。由于c是a的浅拷贝,只拷贝了父对象,因此a的子对象( ['a', 'b', 'c', 'hello'])改变时会影响到c;d是深拷贝,完全不受a的影响
页: [1]
查看完整版本: 对前一次python统计的优化