python的一些小坑

最近写pytoon的时候碰到了许多的坑。这里记录一下。

坑1

因为一些原因,我写了类似的代码

1
from random import *
import os
for i in range(20):
    pid = os.fork()
    if pid == 0:
        break
print “pid = ”,pid,randint(100,200)

然后运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pid = 28106 the random num= 104
pid = 28107 the random num= 104
pid = 28108 the random num= 104
pid = 28109 the random num= 104
pid = 28113 the random num= 104
pid = 28112 the random num= 104
pid = 28114 the random num= 104
pid = 28118 the random num= 104
pid = 28116 the random num= 104
pid = 28115 the random num= 104
pid = 28119 the random num= 104
pid = 28120 the random num= 104
pid = 28124 the random num= 104
pid = 28122 the random num= 104
pid = 28123 the random num= 104
pid = 28125 the random num= 104
pid = 28126 the random num= 104
pid = 28127 the random num= 104
pid = 28128 the random num= 104
pid = 28129 the random num= 104
pid = 0 the random num= 104

这是搞毛啊。。。。。
其实原因也很简单,就是linux在fork的时候几乎会复制整个内存空间。这自然也就包括了random产生随机数的种子。这就导致fork之后产生的随机数是一样的。

解决方法很简单,一个是在每次fork之后重生初始化种子。二是使用os包中的urandom函数。

1
2
3
from os import urandom
from struct import unpack
print unpack('i',urandom(4))[0]

坑2

这个是习惯问题,平时稍微注意肯定不会犯错

1
2
3
import time
import random
random.seed(time.time)

这代码并不会报错Orz

坑3

这个坑就比较简单了。我写了类似这样的函数

1
2
3
4
5
6
7
import time
def fun(t = time.time()):
print t

for i in range(5):
fun()
time.sleep(1)

输出结果也是一样的

1
2
3
4
5
1458882445.62
1458882445.62
1458882445.62
1458882445.62
1458882445.62

所以,如果真的需要这样写,应该这样子

1
2
3
4
5
6
7
8
9
import time
def fun(t = None):
if t == None:
t = time.time()
print t

for i in range(5):
fun()
time.sleep(1)