六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 86|回复: 0

对前一次python统计的优化

[复制链接]

升级  48%

6

主题

6

主题

6

主题

童生

Rank: 1

积分
24
 楼主| 发表于 2013-1-19 04:09:55 | 显示全部楼层 |阅读模式
import reimport copyfor i in infile:temp = file(i)text= temp.read()for j in range(len(li)):m = re.findall(li[j].website,text,re.S|re.M|re.L)if len(m) != 0:cdncopy = copy.deepcopy(li[j].cdn)cdncopy.append(i[:-6])li[j].cdn = cdncopyli[j].number += 1

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

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

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

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

结果:
[[4, 4], [4, 4], [4, 4], [4, 4], [4, 4]]
[[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]]

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

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

>>>import copy
>>>a = [1, 2, 3, 4, ['a', 'b', 'c']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)

很容易理解:a是一个列表,表内元素a[4]也是一个列表(也就是一个内部子对象);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[4].append('hello')   #操作2

这时再查看结果:

>>> a
[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]
>>> b
[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]
>>> c
[1, 2, 3, 4, ['a', 'b', 'c', 'hello']]
>>> d
[1, 2, 3, 4, ['a', 'b', 'c']]

可以发现a、b受了操作1、2的影响,c只受操作2影响,d不受影响。a、b结果相同很好理解。由于c是a的浅拷贝,只拷贝了父对象,因此a的子对象( ['a', 'b', 'c', 'hello'])改变时会影响到c;d是深拷贝,完全不受a的影响
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表