对前一次python统计的优化
import reimport copy
for 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 = cdncopy
li.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 li
li=[]
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]