python中的陷阱(1)
d = {} 与 d.clear() 的区别
在工作中我想实现一个这样的效果:
在循环中把一个字典的不同状态值加入到list里面去,可是这个结果一致很异常。
看下面的问题代码:
In [1]: l = [] In [2]: p = {} In [3]: for i in xrange(5): ...: p.clear() ...: p[str(i)] = i ...: print p ...: l.append(p) ...: print l ...: ...: {'0': 0} [{'0': 0}] {'1': 1} [{'1': 1}, {'1': 1}] {'2': 2} [{'2': 2}, {'2': 2}, {'2': 2}] {'3': 3} [{'3': 3}, {'3': 3}, {'3': 3}, {'3': 3}] {'4': 4} [{'4': 4}, {'4': 4}, {'4': 4}, {'4': 4}, {'4': 4}]
发现了吗? l.append操作每次只是把对象的地址放入了队列里面进行保存,而p.clear() 这个函数不会创建新的字典,只是把原来p = {}创建的变量内容给清空了。我们每次放入l之中的都是p = {}创建的变量地址,所以导致l 里面的结果跟所想想的完全不一致。
作为对比,下面才是我们想要的结果。
In [6]: l = [] In [7]: for i in xrange(5): p = {} p[str(i)] = i print p l.append(p) print l ....: ....: {'0': 0} [{'0': 0}] {'1': 1} [{'0': 0}, {'1': 1}] {'2': 2} [{'0': 0}, {'1': 1}, {'2': 2}] {'3': 3} [{'0': 0}, {'1': 1}, {'2': 2}, {'3': 3}] {'4': 4} [{'0': 0}, {'1': 1}, {'2': 2}, {'3': 3}, {'4': 4}]
我们必须在for循环的开始就通过p = {} 来创建一个新的变量,跟之前的那个变量地址完全不能一样。这样才能让不同的字典加入到我们的队列里面
上面是我的猜测,是真的这样吗? 我们验证一下
In [20]: l = [] In [21]: for i in xrange(5): p = {} p[str(i)] = i print p l.append(p) print l p.clear() ....: ....: {'0': 0} [{'0': 0}] {'1': 1} [{}, {'1': 1}] {'2': 2} [{}, {}, {'2': 2}] {'3': 3} [{}, {}, {}, {'3': 3}] {'4': 4} [{}, {}, {}, {}, {'4': 4}]
看到了吗? clear()成员函数清空了p = {}产生的变量的内容,而列表里面仍然保存着这个空变量的地址,列表自己当然不知道了。。 所以很遗憾。。 我们什么都没得到。。 我应该在最后再打印下l , 不过其实已经没有必要了, 不是吗?
python处理url
我现在有一些这样的数据,用来生成url,以提供给爬虫进行爬取。
Venture Capital
Banking (excl. Investment Banking)
Washington, D.C.
Nightlife in Washington, DC
Amazon $175mm Investment in LivingSocial (December 2010)
Twitter's Future
Florian Leibert / Noirin Shirley Incident
这些数据最终要以 - 进行连接,来生成地址。
上代码:
#ipython 下执行 import re In [41]: path = re.sub("[?@ =#().&]", "-", "Banking (excl. Investment Banking)") In [42]: path Out[42]: 'Banking--excl--Investment-Banking-' In [43]: path1 = re.sub("-+","-",path) In [44]: path1 Out[44]: 'Banking-excl-Investment-Banking-' In [45]: path1.rstrip('-') Out[45]: 'Banking-excl-Investment-Banking'
如果有一些新发现的奇怪字符,在
re.sub("[?@ =#().&]", "-", "Banking (excl. Investment Banking)")
那一堆符号里面加上新符号就是了。