Python constructor argument not random bug?
我最近发现了这只奇怪的Python"臭虫",我想看看是否有人知道更多关于它的信息!
例如,以python模块为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import random class SaySomething: def __init__(self, value=random.randint(1, 3)): if value == 1: print 'one' elif value == 2: print 'two' elif value == 3: print 'three' a = 0 while a < 10: SaySomething() a += 1 |
由于某种原因,此代码将打印相同的数字10次!!!!现在我不明白了。似乎连续10次使用相同的值调用构造函数。但是,如果您打印每个
现在,如果您更改:
1 | SaySomething() |
到
1 | SaySomething(random.randint(1, 3)) |
它按预期运行,并进行实际的随机选择。
有人知道为什么会这样吗?
问题是,在创建函数时,python中的默认参数只计算一次。要解决此问题,请尝试:
1 2 3 4 5 6 7 | def __init__(self, value = None): if value is None: value = random.randint(1, 3) if value == 1: print 'one' elif value == 2: print 'two' elif value == 3: print 'three' |
这样,我们将随机化转换为函数本身,而不是在函数定义时。
在python中,默认参数初始化一次。因此,您一次又一次地得到相同的值,因为这是初始化默认参数时的值。参见http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/
这是因为当编译或解释类时,变量
与在python构造函数中使用可选参数做奇怪的事情的原因相同
可选参数的默认值是单个实例,因此对于正在生成的所有实例,只计算一次。
要解决这个问题:
1 2 3 4 5 6 7 8 | import random class saySomething: def __init__(self, value = None): random_value = random.randint(1, 3) if value == None else value if random_value in [1, 2, 3] print ['one', 'two', 'three'][random_value - 1] for a in xrange(10): saySomething() |